@CompponmentScan 代替@Bean 分别新增controller,service,dao三个package,并增加响应的类,通过@Controller,@Service,@Repository三个注解将三个类声明为Bean
@Controller
public class PersonController {
}
@Service
public class PersonService {
}
@Repository
public class PersonDao {
}
修改BeanConfig,增加@ComponentScan注解,将com.citi包下面的所有Bean都扫描到BeanConfig这个配置类中,就相当于XML配置文件中有许多bean标签,好处是不用一个个写bean标签,通过一个注解可以扫描所有的Bean
@Configuration
@ComponentScan(basePackages = “com.citi”)
public class BeanConfig {
}
测试IoC容器是否实例化扫描到的Bean,新增一个ComponentScanTest测试类
public class ComponentScanTest {
@Test
public void getBeansByScan(){
ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
控制台输出如下,自定义的三个类,包括BeanConfi本身都被容器实例化
entity包中的Person类没有被实例化,是因为Person类上没有添加注解,也即是没有配置bean标签,所以没有注册到容器中,也就没有被实例化,给Person实体类添加一个@Component注解,标识为一个Bean,再次执行测试方法,控制台打印结果如下,Person类被实例化
@ComponentScan源码
includeFilters()的使用
includeFilters()和excludeFilters()返回都是一个Filter数组
FilterType是一个枚举类,默认是ANNOTATION,注解方式
修改BeanConfig代码,增加includeFilters(),只扫描com.citi包下面的@Controller,@Service注解标识的Bean,一定不要忘记useDefaultFilters = false
@Configuration
@ComponentScan(basePackages = “com.citi”,
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class, Service.cla