AAAMybatis使用MapperScannerConfigurer实现自动注册dao到spring容器
来源:互联网 发布:php 二进制转字符串 编辑:程序博客网 时间:2024/06/07 18:12
测试于:Mybatis 3.2.2
本文目标
Mabatis 实现自动注册dao到spring容器中。
本文将分析mybatis与spring整合的MapperScannerConfigurer的底层原理,之前已经分析过java中实现动态,可以使用jdk自带api和cglib第三方库生成动态代理。本文分析的mybatis版本3.2.7,mybatis-spring版本1.2.2。
MapperScannerConfigurer介绍
MapperScannerConfigurer是spring和mybatis整合的mybatis-spring jar包中提供的一个类。
想要了解该类的作用,就得先了解MapperFactoryBean。
MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现。也就是说如果你配置了MapperFactoryBean,你就不用再写daoImp层了的东西,直接在dao层定义一个方法,只要该方法与那个XML方法名称一致,就可以了
而一般的使用SqlSessionTemplate这种方法一般是通过配置一个工厂类,一般这个工厂类都是作为这个模板类的构造参数,
这是在spring中配置的,然后使用使用的时候,直接实例化这个模板类,它的参数形式是 (命名空间.方法名,JavaBean),这种是最的执行sql的方法。
比如下面这个官方文档中的配置:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
org.mybatis.spring.sample.mapper.UserMapper是一个接口,我们创建一个MapperFactoryBean实例,然后注入这个接口和sqlSessionFactory(mybatis中提供的SqlSessionFactory接口,MapperFactoryBean会使用SqlSessionFactory创建SqlSession)这两个属性。
之后想使用这个UserMapper接口的话,直接通过spring注入这个bean,然后就可以直接使用了,spring内部会创建一个这个接口的动态代理。
当发现要使用多个MapperFactoryBean的时候,一个一个定义肯定非常麻烦,于是mybatis-spring提供了MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
这段配置会扫描org.mybatis.spring.sample.mapper下的所有接口,然后创建各自接口的动态代理类。
MapperScannerConfigurer底层代码分析
以以下代码为示例进行讲解(部分代码,其他代码及配置省略):
package org.format.dynamicproxy.mybatis.dao;
public interface UserDao {
public User getById(int id);
public int add(User user);
public int update(User user);
public int delete(User user);
public List<User> getAll();
}
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.format.dynamicproxy.mybatis.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
我们先通过测试用例debug查看userDao的实现类到底是什么。
我们可以看到,userDao是1个MapperProxy类的实例。
看下MapperProxy的源码,没错,实现了InvocationHandler,说明使用了jdk自带的动态代理。
public class MapperProxy<T> implements InvocationHandler, Serializable {
private static final long serialVersionUID = -6424540398559729838L;
private final SqlSession sqlSession;
private final Class<T> mapperInterface;
private final Map<Method, MapperMethod> methodCache;
public MapperProxy(SqlSession sqlSession, Class<T> mapperInterface, Map<Method, MapperMethod> methodCache) {
this.sqlSession = sqlSession;
this.mapperInterface = mapperInterface;
this.methodCache = methodCache;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (Object.class.equals(method.getDeclaringClass())) {
try {
return method.invoke(this, args);
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
}
final MapperMethod mapperMethod = cachedMapperMethod(method);
return mapperMethod.execute(sqlSession, args);
}
private MapperMethod cachedMapperMethod(Method method) {
MapperMethod mapperMethod = methodCache.get(method);
if (mapperMethod == null) {
mapperMethod = new MapperMethod(mapperInterface, method, sqlSession.getConfiguration());
methodCache.put(method, mapperMethod);
}
return mapperMethod;
}
配置方法
我这里直接给出devnote的配置代码,方法见红色字体部分:
<description>Spring公共配置 </description><!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 --><context:component-scan base-package="base,dcode"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><context:property-placeholder ignore-unresolvable="true" location="classpath:application.properties" /> <!-- 数据源配置, 使用DBCP数据库连接池 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info --> <property name="maxActive" value="${dbcp.maxActive}" /> <property name="maxIdle" value="${dbcp.maxIdle}" /> <property name="defaultAutoCommit" value="false" /> <!-- 连接Idle一个小时后超时 --> <property name="timeBetweenEvictionRunsMillis" value="3600000" /> <property name="minEvictableIdleTimeMillis" value="3600000" /></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:mybatis/*.xml"/></bean><!-- 自动注册mybatis mapper bean --><!-- 注意,没有必要去指定SqlSessionFactory或SqlSessionTemplate, 因为MapperScannerConfigurer将会创建 MapperFactoryBean,之后自动装配。 但是,如果你使 用了一个以上的DataSource,那 么自动装配可能会失效。 这种情况下,你可以使用 sqlSessionFactoryBeanName或sqlSessionTemplateBeanName 属性来设置正确的 bean名称来使用。 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="base.mapper,dcode.mapper" /></bean>
相关说明
当你的mapper bean存在于多个目录下时,basePackage的值可以配置成多个目录,中间用英文逗号隔开即可。
0 0
- AAAMybatis使用MapperScannerConfigurer实现自动注册dao到spring容器
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring - 大新博客
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring - 大新博客
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring -
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- android Xml控件属性
- 代码:编写一个简单的字符设备驱动——创建多个同类型设备
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
- 保护模式学习笔记:LDT
- 转向ARC的说明——翻译Apple官方文档
- AAAMybatis使用MapperScannerConfigurer实现自动注册dao到spring容器
- matlab_格式转化
- Beyond video games: New artificial intelligence beats tactical experts in combat simulation
- 实现背景透明文字不透明
- IntelliJ IDEA 配置 Tomcat8
- Electric Power Systems Research (EPSR) 的审稿周期
- oracle undo 解析
- hadoop(2)
- Android基础----BroadcastReceiver