为什么要说这个?
对于Spring体系而言,我个人认为最重要的就是IOC容器,其次才是AOP、Context等模块;因为这些模块功能是或搭建或集成在IOC容器这个基础设施之上的。
直接基于Spring框架体系做开发时,可以通过常用的JavaConfig或XML方式将对象的生命周期及装配由容器原生的接管。如下
这几种是我们最常用最常见的注入方式。而后通过Spring框架的原生装配方式@AutoWired或是JAVA规范的@Resource注解装配。
这是前言,平时查看源码时,比如mybatis或是seata、Nacos等框架要集成到Spring中,有蛮多我们不常用但是很实用的方式,这也是框架集成到SPring中最常用的方式,接下来,就来盘一下。
首先是FactoryBean,这是可定制可扩展的Bean定义方式,也是用的最多的,在Spring集成JDK或CGLIB的功能实现AOP时,便是基于此接口实现,当然还有Mybatis的SqlSessionFactoryBean以及MapperFactoryBean再就是Seata中的DataSource代理等,都是基于此接口实现,从而集成到Spring中,由Spring接管关键对象的生命周期管理。
最后就是不常用但是功能很强大的方式——BeanDefinitionRegistryPostProcessor接口动态注入BeanDefinition对象。
简单聊一下,Spring中Bean的管理其实是分为两块流程的,我们一般都是聚焦在Bean的生命周期模块,也就是实例化->属性填充->初始化->卸载;但是还有一个最开始的步骤也就是Bean的注册。
Bean的注册是从BeanDefinition这个对象的构造与注入开始的。而BeanDefinitionRegistryPostProcessor接口或ImportBeanDefinitionRegistrar接口就是基于此流程,通过实现此接口,从BeanDefinition开始构造对象,然后注入到容器中。在mybatis集成SPring中,Mapper接口对象的注入就是基于此接口来实现;还有一个应用就是dubbo集成Spring同样也是如此。但这个方式用得少。