目录
自动扫描组件
之前的做法
之前我们如果在我们自定义的类上加上了@Controller、@Service、@Repository、@Component注解,然后再配置文件中加入以下配置就可以自动扫描到容器中
<context:component-scan base-package="com.zhujie.abc"></context:component-scan>
现在的做法
之前我们既然已经使用@Configuration注解来替代了配置文件那么,那么上述配置我们同样可以使用一个注解@ComponentScan来解决。
@Configuration
@ComponentScan(basePackages = {"com.zhujie"})
public class MainConfig {
@Bean("use")
public User getUser(){
return new User(1001,"张三");
}
}
我们创建三个标记注解的类如下
测试有几个对象被容器创建
@Test
public void test2(){
ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
//获取容器中被创建的对象的name即传统方式时候bean标签中的id
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for(String name : beanDefinitionNames){
System.out.println(name);
}
}
指定扫描规则
上述使用@ComponentScan注解后,容器会扫描com.zhujie包及其子包下标注有@Controller、@Service、@Repository、@Component的类到容器中。那么,如果想排除一些包下的类不注册到容器中的话我们可以使用excludeFilters属性来指定
@Configuration
@ComponentScan(basePackages = {"com.zhujie"},excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})
//excludeFilters 是一个数组
public class MainConfig {
@Bean("use")
public User getUser(){
return new User(1001,"张三");
}
}
我们在运行之前的测试类会发现userController组件已经不存在了
如果只是想包含某写组件的话我们可以使用 includeFilters,同时的需要将useDefaultFilters设置为false
@Configuration
@ComponentScan(basePackages = {"com.zhujie"},includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
},useDefaultFilters = false)
//excludeFilters 是一个数组
public class MainConfig {
@Bean("use")
public User getUser(){
return new User(1001,"张三");
}
}
运行之前的测试代码,看到标记注解而类中只有controller组件被注册到容器
最后
@ComponentScan是一个可重复注解
因此,我们在之前的配置类中可以写多个@ComponentScan注解。这里被扫描到容器的组件就只有controller和Service了
运行测试类,看控制台效果
@ComponentScans注解的使用
上面我们写了多个 @ComponentScan,当然我们可以使用@ComponentScans来表示多个@ComponentScan的效果
@Configuration
@ComponentScans({
@ComponentScan(basePackages = {"com.zhujie"},includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
},useDefaultFilters = false),
@ComponentScan(basePackages = {"com.zhujie"},includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class})
},useDefaultFilters = false)
})
//excludeFilters 是一个数组
public class MainConfig {
@Bean("use")
public User getUser(){
return new User(1001,"张三");
}
}
运行之前的测试类,效果是一样的