條條大路通羅馬
前提:怕讀者沒有頭緒,請在https://blog.csdn.net/dong19891210/article/details/105697175的情況下看
Spring bean有以下幾種注冊方式:
1. 通過GenericBeanDefinition注冊
示例代碼:
消息輔助類
注冊測試類:
結果:
2. 通過BeanDefinitionBuilder注冊
效果同第一種情況,只是用的是BeanDefinitionBuilder模式
3. 通過BeanFactoryPostProcessor
配置類
測試類:
效果:
4. 通過BeanDefinitionRegistryPostProcessor
配置類
測試類:
效果:
5. 通過Import
import類型有以下幾類:
5.1 ImportSelector導入
測試代碼和效果:
注:我是以demo演示(selectImports()寫死了),實際場景中可以動態注入bean,想象空間很大。
5.2 ImportBeanDefinitionRegistrar注冊
配置類:
測試
5.3 組合式,比如kafak集成到spring
最終測試:
附詳情參考源碼ConfigurationClassParser類處理如何處理不同的import
總結:我是層層遞進寫的,spring bean 注冊幾種方式:GenericBeanDefinition,BeanDefinitionBuilder(設計模式無處不在),BeanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor,Import型。
靈活性很強,很難達成統一(連交通規矩都難一統,更何況這),條條大路通羅馬,沒有最好只有合適,如果讓你選擇注冊bean或擴展性開發或集成第三方,你會選哪種呢,可以參考mybatis(用ImportBeanDefinitionRegister注冊) ,activemq,kafak組合式,dubbo,redis等,甚至spring aop也算是bean的注冊(用了其他的方式注冊進來)擴展,也包括Spring Boot里@SpringBootApplication,springboot也是spring bean的擴展開發,不是嗎!!!決定已知性的bean可寫死注冊,不確定性的最好可配置性組合。搞懂了Spring bean及衍生品(就像金融衍生品一樣),就搞懂了90%中國軟件開發java領域業務技術的方向
參考:
1. BeanDefinitionBuilder.java https://alvinalexander.com/java/jwarehouse/spring-framework-2.5.3/src/org/springframework/beans/factory/support/BeanDefinitionBuilder.java.shtml
2. bean definition for automatic FilterRegistrationBeanFactory http://dimafeng.com/2015/11/27/dynamic-bean-definition/
3. 使用@import導入實現了ImportBeanDefinitionRegistrar接口的類 https://blog.51cto.com/14672031/2474904
4. Spring向容器注冊Bean的高級應用 https://cloud.tencent.com/developer/article/1497795
5. How to integrate Jdon Framework with Spring http://en.jdon.com/springIntegration.html
6. Spring Boot dynamically injects beans through importbeandefinitionregister
7. Spring - Using ImportBeanDefinitionRegistrar
https://www.logicbig.com/tutorials/spring-framework/spring-core/import-bean-registrar.html
10. Spring - Dynamically register beans https://www.logicbig.com/tutorials/spring-framework/spring-core/bean-definition.html