1,@ComponentScan注解是什么

其实很简单,@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中

2,@ComponentScan注解的详细使用

做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中,好下面咱们就先来简单演示一下这个例子

示例:

创建controller:

@Controller
public class UserController {
}

创建service:

@Service
public class UserService {
}

创建dao:

@Repository
public class UserDao {
}

添加启动类:

@Configuration
@ComponentScan(value = "com.spring.annotation")
public class ScanConfig {

}

设置@ComponentScan注解,添加 value = "com.spring.annotation" ,表示扫描对应包下的所有注解

测试:

    @Test
    public void test02() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScanConfig.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }

结果:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory

scanConfig
annotationConfig
userController
userDao
userService

可以看到对应的实体类已经注入到容器中

不仅如此,@ComponentScan 提供了过滤器可以过滤指定的注解进行注入

excludeFilters (排除过滤器)

@Configuration
@ComponentScan(value = "com.spring.annotation",excludeFilters = {
        @ComponentScan.Filter(type=FilterType.ANNOTATION,classes={Controller.class})
})
public class ScanConfig{

}

 @ComponentScan.Filter 指定了过滤器的规则,FilterType.ANNOTATION 表示按注解过滤(其他几种方法稍后再讲),classes指定需要过滤的注解,Controller注解被排除,classes为数组可以指定多个,重新运行结果:

scanConfig
annotationConfig
userDao
userService

可以看到 原来的 userController 已经消失,说明没有被注入到容器中去


includeFilters  (包含过滤器)

@Configuration
@ComponentScan(value="com.spring.annotation",
//        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})}
        includeFilters = {
            @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}
        )},useDefaultFilters = false
)
public class ScanConfig {
}

运行结果:

scanConfig
userController

可以看到只有 被@controller注解的bean注入到容器中去

 

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐