FactoryBean作用和实例讲解

FactoryBean

FactoryBean 是什么

是 Spring 框架中的一个接口,用于创建和管理对象实例。它允许开发者在对象创建的过程中进行更多的控制和定制化

FactoryBean 与Spring 框架如何协作的?

当使用 @Autowired 注解注入 Bean 时,如果 Bean 的类型是由 FactoryBean 创建的,Spring 在解析依赖关系时会自动调用 FactoryBean.getObject()方法来获取实际的 bean 实例,并将其注入到依赖对象中

具体体现在 AutowiredAnnotationBeanPostProcessor在调用 beanFactory(DefaultListableBeanFactory) 中的 findAutowireCandidates 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1.自动匹配注入Bean
org.springframework.beans.factory.support.DefaultListableBeanFactory#findAutowireCandidates
// 2.列举bean的工厂
String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors( this, requiredType, true, descriptor.isEager());

// 3.根据工厂类名称获取工厂FactoryBean
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)

// 4、 获取给定 Bean 实例的对象,可以是 Bean 实例本身,也可以是 FactoryBean 中创建的对象
org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance

// 5. 调用FactoryBean
org.springframework.beans.factory.FactoryBean#getObject


Mybatis Plus的 MapperProxyFactory

MapperRegistry 与MapperProxyFactory,MapperFactoryBean ,@Mapper还有Spring 之间的调用关系, 他们之间怎么协同的

MapperRegistry

MapperRegistry: MapperRegistry 是 MyBatis 中负责管理所有 Mapper 接口的注册中心。它会记录下所有已经被加载的 Mapper 接口,并提供获取 Mapper 接口的方法。

MapperProxyFactory

MapperProxyFactory: MapperProxyFactory 是 MyBatis 用来创建 Mapper 接口的代理对象的工厂。它通过 Java 动态代理技术或者 CGLIB 动态生成代理对象,以实现对 Mapper 接口方法的拦截和执行。

@Mapper

@Mapper 注解: @Mapper 是 MyBatis 提供的一个注解,用于标识一个接口为 Mapper 接口。当 Spring 配置了 MyBatis 的包扫描机制时,扫描到带有 @Mapper 注解的接口,会将其视为 Mapper 接口进行处理。

MapperFactoryBean

MapperFactoryBean: MapperFactoryBean 是 Spring 提供的一个工厂 Bean,用于将 MyBatis 中的 Mapper 接口整合到 Spring 容器中。它实现了 Spring 的 FactoryBean 接口,负责创建 Mapper 接口的代理对象,并将其纳入 Spring 管理。

接下来,让我们来详细描述它们之间的调用关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
当 Spring 配置了 MyBatis 的包扫描机制时(例如通过 @MapperScan 注解或者 <mybatis:scan> 标签配置),Spring 会扫描指定的包路径,找到带有 @Mapper 注解的接口。

扫描到带有 @Mapper 注解的接口后,Spring 将会在 MapperRegistry 中注册这些接口。

在 Spring 容器初始化时,如果配置了 MyBatis 的整合,会初始化 MapperFactoryBean,这个工厂 Bean 负责创建 Mapper 接口的代理对象。

当需要使用某个 Mapper 接口时,例如在 Service 类中需要注入 Mapper 接口的实例,Spring 会根据配置的 MapperFactoryBean 创建代理对象,并将其注入到 Service 类中。

在创建代理对象时,MapperFactoryBean 会利用 MapperProxyFactory 来动态生成 Mapper 接口的代理对象。

代理对象中的方法调用会被拦截,交给 MyBatis 的 SQL 执行器执行相应的 SQL 语句,从而实现了对数据库的访问。

综上所述,MapperRegistry 负责管理 Mapper 接口,@Mapper 注解标识 Mapper 接口,MapperProxyFactory 创建 Mapper 接口的代理对象,MapperFactoryBean 将代理对象整合到 Spring 容器中。
它们之间的协同工作使得 MyBatis Mapper 接口能够无缝地与 Spring 整合,并实现了对数据库的访问。

总结

当我们使用XxxMapper的时候 通过 @Autowired 注入Mapper 在一开始 并没有对应的@Bean
而是Spring 通过工厂类 去创建了一个代理对象
MapperProxyFactory 根据对应的方法名参数解析成对应的SQL