typeAliasesPackage 默认只能扫描某一个路径下,或以逗号等分割的 几个路径下的内容,不支持通配符和正则,采用重写的方式解决

  1. package com.xxxx.xxx.util.common;
  2. import com.xxxx.xxx.util.LogUtil;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.slf4j.Logger;
  6. import org.springframework.core.io.Resource;
  7. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  8. import org.springframework.core.io.support.ResourcePatternResolver;
  9. import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
  10. import org.springframework.core.type.classreading.MetadataReader;
  11. import org.springframework.core.type.classreading.MetadataReaderFactory;
  12. import org.springframework.util.ClassUtils;
  13. import java.io.IOException;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. /**
  17. * Created by Administrator on 2015/10/6.
  18. */
  19. public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean {
  20. static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
  21. private static Logger logger = LogUtil.get();
  22. @Override
  23. public void setTypeAliasesPackage(String typeAliasesPackage) {
  24. ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
  25. MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
  26. typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
  27. ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;
  28. //将加载多个绝对匹配的所有Resource
  29. //将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分
  30. //然后进行遍历模式匹配
  31. try {
  32. List<String> result = new ArrayList<String>();
  33. Resource[] resources =  resolver.getResources(typeAliasesPackage);
  34. if(resources != null && resources.length > 0){
  35. MetadataReader metadataReader = null;
  36. for(Resource resource : resources){
  37. if(resource.isReadable()){
  38. metadataReader =  metadataReaderFactory.getMetadataReader(resource);
  39. try {
  40. result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
  41. } catch (ClassNotFoundException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }
  46. }
  47. if(result.size() > 0) {
  48. super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ","));
  49. }else{
  50. logger.warn("参数typeAliasesPackage:"+typeAliasesPackage+",未找到任何包");
  51. }
  52. //logger.info("d");
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
package com.xxxx.xxx.util.common;  

import com.xxxx.xxx.util.LogUtil;
import org.apache.commons.lang3.StringUtils;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* Created by Administrator on 2015/10/6.
*/
public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean { static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; private static Logger logger = LogUtil.get(); @Override
public void setTypeAliasesPackage(String typeAliasesPackage) {
ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN; //将加载多个绝对匹配的所有Resource
//将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分
//然后进行遍历模式匹配
try {
List<String> result = new ArrayList<String>();
Resource[] resources = resolver.getResources(typeAliasesPackage);
if(resources != null && resources.length > 0){
MetadataReader metadataReader = null;
for(Resource resource : resources){
if(resource.isReadable()){
metadataReader = metadataReaderFactory.getMetadataReader(resource);
try {
result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
if(result.size() > 0) {
super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ","));
}else{
logger.warn("参数typeAliasesPackage:"+typeAliasesPackage+",未找到任何包");
}
//logger.info("d");
} catch (IOException e) {
e.printStackTrace();
}
} }

然后在mybatis的配置文件中修改

  1. <bean id="sqlSession" class="com.xxxx.xxxx.util.common.PackagesSqlSessionFactoryBean">
  2. <property name="configLocation" value="classpath:config/sqlmap/sqlmap-config.xml" />
  3. <property name="dataSource" ref="dataSource"/>
  4. <!--<property name="mapperLocations"-->
  5. <!--value="classpath*:com/xxxx/xxxx/merchant/**/domain/mapper/*.xml"/>-->
  6. <property name="typeAliasesPackage" value="com.xxxx.xxxx.custom.*.domain"/>
  7. <property name="plugins">
  8. <array>
  9. <ref bean="pageInterceptor"/>
  10. </array>
  11. </property>
  12. </bean>
  13. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  14. <property name="basePackage" value="com.xxxx.xxxx.**.dao"/>
  15. </bean>
<bean id="sqlSession" class="com.xxxx.xxxx.util.common.PackagesSqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/sqlmap/sqlmap-config.xml" />
<property name="dataSource" ref="dataSource"/>
<!--<property name="mapperLocations"-->
<!--value="classpath*:com/xxxx/xxxx/merchant/**/domain/mapper/*.xml"/>-->
<property name="typeAliasesPackage" value="com.xxxx.xxxx.custom.*.domain"/>
<property name="plugins">
<array>
<ref bean="pageInterceptor"/>
</array>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxxx.xxxx.**.dao"/>
</bean>


Mybatis 自定义SqlSessionFactoryBean扫描通配符typeAliasesPackage的更多相关文章

  1. mybaits3.2.8 别名包扫描通配符

    <mybatis.version>3.2.8</mybatis.version><mybatis.spring.version>1.2.2</mybatis. ...

  2. Mybatis3.2不支持Ant通配符TypeAliasesPackage扫描的解决方案

    业务场景 业务场景:首先项目进行分布式拆分之后,按照模块再分为为api层和service层,web层. 其中订单业务的实体类放在com.muses.taoshop.item.entity,而用户相关的 ...

  3. Mybatis自定义SQL拦截器

    本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...

  4. spring与mybatis整合(扫描Mapper接口)

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...

  5. Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean

    问题描述: 一月 15, 2014 3:43:13 下午 org.springframework.context.support.AbstractApplicationContext prepareR ...

  6. Mybatis自定义分布式二级缓存实现与遇到的一些问题解决方案!

    先说两句: 我们都知道Mybatis缓存分两类: 一级缓存(同一个Session会话内) & 二级缓存(基于HashMap实现的以 namespace为范围的缓存) 今天呢, 我们不谈一级缓存 ...

  7. springboot整合mybatis遇到无法扫描MaperScan包的问题

    1.启动类加上@MaperScan注解后,一直报错如下: Error creating bean with name 'platUserMapper' defined in file [D:\work ...

  8. MyBatis Spring SqlSessionFactoryBean 配置

    在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建.而在 MyBatis-Spring 中,则使用 SqlSessionFactory ...

  9. 利用Sonar定制自定义JS扫描规则(二)——自定义JS扫描规则

    在上一篇blog中,我们将sonar几个需要的环境都搭建好了,包括sonar的服务器,sonar runner,sonar的javascript插件.现在我们就来讲如何自定义JS扫描规则. 实际上有3 ...

随机推荐

  1. Android笔记之属性动画

    前言.动画分类 例如以下图所看到的,Android的动画主要分为三种: 以下首先说说 属性动画 所谓属性动画-- 就是指对象的属性值发生了变化,如控件位置和透明度等. 举例,如今要实现一个按键先下移. ...

  2. (Delphi) Using the Disk Cache 使用磁盘缓存

    The Chilkat Spider component has disk caching capabilities. To setup a disk cache, create a new dire ...

  3. mysql 筛选重复项(单列或者多列同时重复)

    原文:https://blog.csdn.net/luyaran/article/details/80929026 -------------单列----------------------- SEL ...

  4. 论DELPHI三层的数据序列格式的变化

    论DELPHI三层的数据序列格式的变化 要窥三层的数据序列格式,我们可以通过观察DELPHI官方的客户端内存表. 早先流行的是TClientDataSet,它的Data和Delta属性的数据类型都是: ...

  5. 越狱的 ios 如何 获取 读取 提取 手机上的 短信 通话记录 联系人 等信息

    http://willson.sinaapp.com/2011/12/iphone 获取短信脚本.html  Iphone获取短信脚本http://bbs.9ria.com/thread-209349 ...

  6. poj Kaka&#39;s Matrix Travels

    Kaka's Matrix Travels 题目: 给出一个矩阵.求仅仅能向下或者向右的情况下能得到的最大和.一般的是指遍历一次,而这个是能够反复走K次.每经过一次后就把该点设为0.求最大和. 算法: ...

  7. Codeforces Round #131 Div1 B

    Problem 给出Ai(i∈[0,9]).表示每一个数字至少须要出现多少次.问有多少个数满足下面三个条件:1. 数至多有N位:2. 数不含有前导0:3. 每一个数 i 出现的次数不少于Ai(mod ...

  8. Java实现用汉明距离进行图片相似度检测的

    Google.Baidu 等搜索引擎相继推出了以图搜图的功能,测试了下效果还不错~ 那这种技术的原理是什么呢?计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂. ...

  9. java.io.IOException: Attempted read from closed stream解决

    在HttpClient请求的时候,返回结果解析时出现java.io.IOException: Attempted read from closed stream. 异常,解决 原因是EntityUti ...

  10. ProgressBar学习笔记,自定义横向进度条的样式(包含ActionBar上面的进度条)

     点显示进度条后→   android:max="100" 进度条的最大值 android:progress  进度条已经完成的进度值 android:progressDrawab ...