在我们使用spring boot时候 spring会默认扫描启动类所在包以及下级包的bean,但是我们又想扫其他的包 又不想放在启动类的同级或子级包的时候该怎么做呢? 其实spring提供给了我们扩展接口的,这时候就可以实现BeanFactoryPostProcessor接口实现 postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法,入参是beanFactory,这时候我们就可以这样写,使用创建扫描器传入注册器 然后设置包名和包括的过滤器和排除的过滤器,再调用scan方法传入包名(支持数组),然后通过实现ApplicationContextAware 接口获取到应用上下文来getBean 测试
1 @Override
2 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
3
4 ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner((BeanDefinitionRegistry) beanFactory, true);
5
6 // scanner.addExcludeFilter(new TypeFilter() {
7 // @Override
8 // public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
9 // return true;
10 // }
11 // });
12 // scanner.addIncludeFilter(new TypeFilter() {
13 // @Override
14 // public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
15 // return true;
16 // }
17 // });
18 scanner.scan("com.demo");
19 DemoController demoController = context.getBean(DemoController.class);
20 System.out.println(demoController.hello());
21 }
因为当前web环境使用的spring上下文实现了BeanDefinitionRegistry接口 registerBeanDefinition方法就会往容器中注册 BeanDefinition 更详细的查看源码
ok