MyBatis关键配置-接口注入使用
我們使用Mapper 的時候,只需要在加了Service 注解的類里面使用@Autowired注入Mapper 接口就好了。
@Service public class EmployeeService {@AutowiredEmployeeMapper employeeMapper;public List<Employee> getAll() {return employeeMapper.selectByMap(null);} }Spring 在啟動的時候需要去實例化EmployeeService。
EmployeeService 依賴了EmployeeMapper 接口(是EmployeeService 的一個屬性)。
Spring 會根據Mapper 的名字從BeanFactory 中獲取它的BeanDefination,再從BeanDefination 中獲取BeanClass , EmployeeMapper 對應的BeanClass 是MapperFactoryBean(上一步已經分析過)。
接下來就是創建MapperFactoryBean,因為實現了FactoryBean 接口,同樣是調用getObject()方法。
// MapperFactoryBean.java public T getObject() throws Exception {return getSqlSession().getMapper(this.mapperInterface); }因為MapperFactoryBean 繼承了SqlSessionDaoSupport , 所以這個getSqlSession()就是調用父類的方法,返回SqlSessionTemplate。
// SqlSessionDaoSupport.java public SqlSession getSqlSession() {return this.sqlSessionTemplate; }第二步,SqlSessionTemplate 的getMapper()方法,里面又有兩個方法:
// SqlSessionTemplate.java public <T> T getMapper(Class<T> type) {return getConfiguration().getMapper(type, this); }第一步:SqlSessionTemplate 的getConfiguration()方法:
// SqlSessionTemplate.java public Configuration getConfiguration() {return this.sqlSessionFactory.getConfiguration(); }進入方法,通過DefaultSqlSessionFactory,返回全部配置Configuration:
// DefaultSqlSessionFactory.java public Configuration getConfiguration() {return configuration; }第二步:Configuration 的getMapper()方法:
// Configuration.java public <T> T getMapper(Class<T> type, SqlSession sqlSession) {return mapperRegistry.getMapper(type, sqlSession); }這一步我們很熟悉, 跟編程式使用里面的getMapper 一樣, 通過工廠類MapperProxyFactory 獲得一個MapperProxy 代理對象。
也就是說,我們注入到Service 層的接口,實際上還是一個MapperProxy 代理對象。所以最后調用Mapper 接口的方法,也是執行MapperProxy 的invoke()方法,后面的流程就跟編程式的工程里面一模一樣了。
總結:
| 對象 | 生命周期 |
| SqlSessionTemplate | Spring 中SqlSession 的替代品,是線程安全的,通過代理的方式調用 DefaultSqlSession 的方法 |
| SqlSessionInterceptor(內部類) | 代理對象,用來代理DefaultSqlSession,在SqlSessionTemplate 中使用 |
| SqlSessionDaoSupport | 用于獲取SqlSessionTemplate,只要繼承它即可 |
| MapperFactoryBean | 注冊到IOC 容器中替換接口類,繼承了SqlSessionDaoSupport 用來獲取 SqlSessionTemplate,因為注入接口的時候,就會調用它的getObject()方法 |
| SqlSessionHolder | 控制SqlSession 和事務 |
思考:@MapperScan 注解是怎么解析的?
?
總結
以上是生活随笔為你收集整理的MyBatis关键配置-接口注入使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis关键配置-接口的扫描注册
- 下一篇: 手写自己的MyBatis框架-这个框架需