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