从BeanFactory
入手,逐步分析Mybatis-starter
工作原理,讲透SpringBoot
与Mybaits
整合的原理。
前言
在专栏Mybatis源码分析中笔者以学习Mybaits
时接触的四行代码为例详细的分析Mybatis
的内部工作原理,感兴趣的同学
可前往专栏Mybatis源码分析进行查看。
入门
Mybatis
的四行代码
//<1> 加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
//<2> 创建sessionFactory对象
sessionFactory = new SqlSessionFactoryBuilder().build(is);
//<3> 获取sqlSession对象信息
SqlSession session = factoy.openSqlSession()
//<4> 构建映射器的代理对象
UserMapper mapper = session.getMapper(UserMapper.class);
// .....调用相关方法信息
而本次我们主要探究Mybatis-starter
的工作原理,即探究分析清楚Spring
整合Mybatis
背后故事
。
橄榄FactoryBean
FactoryBean
——Spring
留给外部框架的扩展点
FactoryBean
是Spring
框架中的一种特殊Bean
。具体来看,FactoryBean
的特殊之处在于它可以向容器中注册两个Bean
,一个是它本身,一个是FactoryBean.getObject()
方法返回值所代表的Bean
。
更通俗一点来讲, FactoryBean
允许开发人员可以定制化地创建和配置Bean
实例,从而使得Bean
的创建过程更加灵活和可扩展。
下面我们便通过一个简单的例子来快速了解FactoryBean
的使用:
public class CustomerFactoryBean implements FactoryBean<UserService> {
@Override
public UserService getObject() throws Exception {
return new UserService();
}
}
上述代码最终会在Spring
的容器中生成了两个Bean
- 一个是类型为
FactoryBean
的customerFactoryBean
- 另一个则是类型为
UserService
的bean
其名称为customerFactoryBean
进一步,如果通过如下代码获取customerFactoryBean
,你会发现其最终的返回值的类型为UserService
而不是FactoyBean
类型。
public class MainApplication {
public static void main(String[] args) {
// 获取bean
Object customerFactoryBean = applicationContext.getBean("customerFactoryBean");
System.out.println(customerFactoryBean);
}
}
这其实是Spring
内部关于FactoryBean
的一个优化处理,如果要获取到FactoryBean
则需要在bean
名称前加上一个