FactoryBean
FactoryBean 是什么
是 Spring 框架中的一个接口,用于创建和管理对象实例。它允许开发者在对象创建的过程中进行更多的控制和定制化
FactoryBean 与Spring 框架如何协作的?
当使用 @Autowired 注解注入 Bean 时,如果 Bean 的类型是由 FactoryBean 创建的,Spring 在解析依赖关系时会自动调用 FactoryBean.getObject()方法来获取实际的 bean 实例,并将其注入到依赖对象中
具体体现在 AutowiredAnnotationBeanPostProcessor在调用 beanFactory(DefaultListableBeanFactory) 中的 findAutowireCandidates 方法。
1 | // 1.自动匹配注入Bean |
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 | 当 Spring 配置了 MyBatis 的包扫描机制时(例如通过 @MapperScan 注解或者 <mybatis:scan> 标签配置),Spring 会扫描指定的包路径,找到带有 @Mapper 注解的接口。 |
总结
当我们使用XxxMapper的时候 通过 @Autowired 注入Mapper 在一开始 并没有对应的@Bean
而是Spring 通过工厂类 去创建了一个代理对象
MapperProxyFactory 根据对应的方法名参数解析成对应的SQL