使用spring 自定义扫描bean

 在我们使用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

 

posted @ 2019-01-11 17:19  柴柴1226  阅读(1756)  评论(0编辑  收藏  举报