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