编写不易,转载请注明(http://shihlei.iteye.com/blog/2405675)!
一 @ComponentScan 概述
扫描指定表下的Component(@Componment,@Configuration,@Service 等等)
存在于:org.springframework.context.annotation 包中
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version${spring.version}</version> </dependency>
二 使用Demo
(1)数据准备
package:x.demo.spring.context.scan.pack1
package x.demo.spring.context.scan.pack1; import org.springframework.stereotype.Component; @Component public class Component1 { } package x.demo.spring.context.scan.pack1; import org.springframework.stereotype.Component; @Component public class Component2 { }
package:x.demo.spring.context.scan.pack3
package x.demo.spring.context.scan.pack3; import org.springframework.stereotype.Component; @Component public class Component3 { }
(2)触发Demo
方法1 :代码方式集成:通过AnnotationConfigApplicationContext 触发@ComponentScan使用
package x.demo.spring.context.scan; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.context.support.ClassPathXmlApplicationContext; import x.demo.spring.context.scan.pack1.Component2; import x.demo.spring.context.scan.pack3.Component3; @ComponentScan(basePackages = {"x.demo.spring.context.scan.pack1"}, basePackageClasses = {Component3.class}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Component2.class)) public class ComponentScanAnnotationDemo { //打印相关信息 private static void show(ApplicationContext context) { String[] beans = {"component1", "component2", "component3"}; for (String b : beans) { boolean isContains = context.containsBean(b); System.out.println(b + " is exist : " + isContains); if (isContains) { System.out.println(b + " : " + context.getBean(b)); } } } /** * 通过AnnotationConfigApplicationContext 触发@ComponentScan使用 */ public static void triggerViaAnnotationConfigApplicationContext() { //加载@ComponentScan 的包扫描 try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();) { context.register(ComponentScanAnnotationDemo.class); context.refresh(); show(context); } } public static void main(String[] args) { ComponentScanAnnotationDemo.triggerViaAnnotationConfigApplicationContext(); } }
方法2:xml 方式触发@ComponentScan使用
(a)xml路径:classpath:x.demo.spring.context.scan/spring-scan.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:annotation-config/> <bean class="x.demo.spring.context.scan.ComponentScanAnnotationDemo"/> </beans>
(b)程序:
package x.demo.spring.context.scan; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.context.support.ClassPathXmlApplicationContext; import x.demo.spring.context.scan.pack1.Component2; import x.demo.spring.context.scan.pack3.Component3; @ComponentScan(basePackages = {"x.demo.spring.context.scan.pack1"}, basePackageClasses = {Component3.class}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Component2.class)) public class ComponentScanAnnotationDemo { //打印相关信息 private static void show(ApplicationContext context) { String[] beans = {"component1", "component2", "component3"}; for (String b : beans) { boolean isContains = context.containsBean(b); System.out.println(b + " is exist : " + isContains); if (isContains) { System.out.println(b + " : " + context.getBean(b)); } } } /** * xml 方式触发@ComponentScan使用 */ public static void triggerViaXml() { try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext ("classpath:x.demo.spring.context.scan/spring-scan.xml");) { show(context); } } public static void main(String[] args) { ComponentScanAnnotationDemo.triggerViaXml(); } }
(3)结果
component1 is exist : true component1 : x.demo.spring.context.scan.pack1.Component1@17baae6e component2 is exist : false component3 is exist : true component3 : x.demo.spring.context.scan.pack3.Component3@69379752
三 常用注解属性设置
(1)basePackages:指定扫描的包,basePackageClasses:指定扫描的类
(2)useDefaultFilters:取消默认filter设置
默认Filter自动扫描包下的Component,取消相当于禁用某个扫描
(3)@ComponentScan.Filter:
指定Filter 规则,可用于excludeFilters 排除Filters ,includeFilters 包含Filters(包含的Filters 在禁用默认Filter使用,否则没有意义)
相关推荐
本文将详细探讨@ComponentScan注解的作用、工作原理以及如何使用它来优化Spring Boot应用程序的组件管理。 @ComponentScan注解是Spring Boot中实现组件自动装配的核心机制。通过合理配置组件扫描,可以提高应用程序...
当我们使用@ComponentScan注解时,Spring Boot框架会自动扫描指定的包中的Bean,并将其注册到Spring容器中。 在扫描过程中,Spring Boot框架会使用AnnotationConfigApplicationContext类来创建一个应用程序上下文...
在 Spring 框架中,使用“@ComponentScan”注解来确定哪些 Spring Bean 在应用程序上下文中可用。但是,如果在默认包中使用“@ComponentScan”,可能会导致应用程序启动速度变慢,并且可能会导致 ...
首先,`@ComponentScan`注解用于指示Spring容器在指定的包及其子包下搜索带有特定注解(如`@Component`、`@Service`、`@Repository`和`@Controller`)的类,将这些类注册为Bean。在启动过程中,Spring会执行以下步骤...
注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before , @Component , @ComponentScan , @ComponentScans , @...
在Spring Boot项目中,通常会有一个主配置类,使用`@SpringBootApplication`注解,它集成了`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`的功能。 在Spring Cloud项目中,这些注解同样发挥着...
@SpringBootApplication 注解是 Spring Boot 的核心注解,它是一个组合注解,实际上是三个 Annotation 的组合:@Configuration、@EnableAutoConfiguration 和 @ComponentScan。这些注解的结合使用,使得 Spring Boot ...
@Configuration 类可以配合 @ComponentScan 使用,自动扫描指定包及其子包下的所有使用了 @Component、@Service、@Repository、@Controller 注解的类,将它们注册为 Spring 容器中的 Bean。例如: ```java @...
一 、注解列表 @SpringBootApplication: 包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。...@ComponentScan: 组件扫描,可自动发现和配置一些Bean。 @Component: 可配合CommandLineRu
Spring可以通过`<context:component-scan>` XML标签或`@ComponentScan`注解来自动扫描并注册带有`@Component`及其派生注解的类。扫描范围可以通过指定包名来控制。 5. **别名(Aliases)** 可以通过`@Component(...
7. **配置类和@ComponentScan**: 在Spring 3.0引入的@Configuration注解的类中,可以结合@ComponentScan一起使用,这样就不再需要XML配置文件,实现了全注解配置。 8. **工具支持**: 使用IDE如IntelliJ IDEA或...
本笔记将介绍如何从传统的XML配置方式转换为使用注解进行开发,以及Spring的@ComponentScan扫描规则和bean的scope属性。 首先,创建一个Spring项目通常是从构建Maven工程开始的。在`pom.xml`中引入`spring-context`...
当在Spring配置中启用@ComponentScan注解时,Spring会遍历指定的包及其子包,寻找带有上述组件注解的类,并将它们注册为bean。例如: ```java @Configuration @ComponentScan("com.example.myapp") public class ...
使用Spring的注解方式实现AOP实例 使用Spring的注解方式实现AOP实例是指通过使用Spring框架提供的注解方式来实现Aspect-Oriented Programming(面向方面编程)的功能。AOP是面向对象编程的一种补充,能够将跨越多个...
4. 组件扫描:@ComponentScan用于扫描Spring组件,确保所有bean都能被正确加载。 5. 日志框架支持:SpringBoot默认使用Logback,但同时也支持Java Util Logging、Log4j2等,可以通过配置文件选择输出到控制台或文件...
本文将深入探讨在Spring配置类中使用注解的一些关键知识点,包括`includeFilters`、`useDefaultFilters`、`@ComponentScans`、`@Conditional`以及`FactoryBean`。 首先,`includeFilters`和`useDefaultFilters`属性...
这些注解都是Spring的@ComponentScan所识别的,它们告诉Spring容器这个类应该被当作一个Bean处理。例如: ```java @Service public class HelloWorldService { public String sayHello() { return "Hello, Spring...
在Spring配置类或者XML配置文件中,使用`@ComponentScan`并添加`@ComponentScan annonation`属性,指定自定义注解的名称。这样,Spring在扫描过程中会识别并处理标记了这个注解的类。 ```java import org.spring...
- **XML方式**:传统的Spring配置使用XML文件来定义bean。例如: ```xml ``` 使用`ClassPathXmlApplicationContext`来加载XML配置并创建容器。 ```java ApplicationContext context = new ...
创建Spring MVC的配置文件,同样使用`@Configuration`注解,但这里的`@ComponentScan`需进行调整,`useDefaultFilters`设置为false,并通过`includeFilters`包含`@Controller`注解的类,以确保Spring MVC能够识别并...