Spring Bean注册的几种方式
条条大路通罗马
前提:怕读者没有头绪,请在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