import java.io.File;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile; import org.apache.ibatis.type.Alias;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mybatis.spring.SqlSessionFactoryBean; import com.yb.common.system.string.StringUtils; public class CustomSqlSessionFactoryBean extends SqlSessionFactoryBean { private static final Logger logger = LogManager.getLogger(CustomSqlSessionFactoryBean.class); @Override
public void setTypeAliasesPackage(String typeAliasesPackage) { logger.debug("typeAliasesPackage = " + typeAliasesPackage); Set<String> typeAliasesPackages = CustomSqlSessionFactoryBean
.getTypeAliasesPackageFromFileAndJar(typeAliasesPackage); String typeAliasesPackageTemp = StringUtils.join(typeAliasesPackages, ","); logger.debug("typeAliasesPackageTemp = " + typeAliasesPackageTemp); super.setTypeAliasesPackage(typeAliasesPackageTemp);
} private static Set<String> getTypeAliasesPackageFromFileAndJar(String typeAliasesPackage) { Set<String> packageNames = new HashSet<String>(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
String typeAliasesPackagePath = typeAliasesPackage.replace(".", "/"); Enumeration<URL> urls = classLoader.getResources(typeAliasesPackagePath); while (urls.hasMoreElements()) {
URL url = urls.nextElement(); logger.debug(url.getPath()); if (url != null) {
String protocol = url.getProtocol(); switch (protocol) {
case "file":
packageNames.addAll(extractPackageFromFile(url, typeAliasesPackage));
break;
case "jar":
packageNames.addAll(extractPackageFromJar(url, typeAliasesPackage));
break;
default:
;
}
}
} } catch (Exception e) {
logger.error("CustomSqlSessionFactoryBean exception");
e.printStackTrace();
} return packageNames;
} private static Set<String> extractPackageFromFile(URL url, String typeAliasesPackage) throws Exception { List<String> packageNames = new ArrayList<String>();
Set<String> set = new HashSet<String>(); String packagePath = typeAliasesPackage.replace(".", File.separator); String path = url.getPath(); File file = new File(path); findClass(file, packageNames); for (int i = 0; i < packageNames.size(); i++) {
String pkgName = packageNames.get(i);
String classNamePath = pkgName.substring(pkgName.indexOf(packagePath), packageNames.get(i).length())
.replace(".class", "");
String className = classNamePath.replace(File.separator, "."); Class<?> clazz = Class.forName(className); if (clazz.isAnnotationPresent(Alias.class)) {
set.add(classNamePath.substring(0, classNamePath.lastIndexOf(File.separator)).replace(File.separator,
"."));
}
} logger.debug("extractPackageFromFile set = " + set); return set;
} private static void findClass(File file, List<String> packageNames) { if (file.exists() && file.isDirectory()) { for (File f : file.listFiles()) {
findClass(f, packageNames);
}
} if (file.getName().endsWith(".class")) {
packageNames.add(file.getAbsolutePath());
} } private static Set<String> extractPackageFromJar(URL url, String typeAliasesPackage) throws Exception { Set<String> packageNames = new HashSet<String>(); JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); JarFile jarFile = jarURLConnection.getJarFile();
Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
String jarEntryName = jarEntry.getName(); if (jarEntryName.endsWith(".class")) {
String className = jarEntryName.substring(0, jarEntryName.indexOf(".class")).replace("/", ".");
Class<?> clazz = Class.forName(className); if (clazz.isAnnotationPresent(Alias.class)) { String packageName = className.substring(0, className.lastIndexOf(".")); logger.debug("typeAliasesPackage = " + packageName); packageNames.add(packageName);
}
}
} logger.debug("extractPackageFromJar set = " + packageNames); return packageNames;
} }

CustomSqlSessionFactoryBean的更多相关文章

  1. Spring-Mybatis配置多数据源

    可以参考: http://www.cnblogs.com/ityouknow/p/6102399.html 需要一个DatabaseConfiguration类,实现 TransactionManag ...

随机推荐

  1. linux 下载文件

    工作流程 1.tar pczvf file.tar.gz file 2.sz file.tar.gz:下载. 3.rm -i file.tar.gz: 删除.

  2. SRM481

    250pt 题意:上帝知道一个“先有鸡还是先有蛋”的答案,上帝和N<=10^6个人说了答案,不过有x个人故意告诉了他们错误的答案,然后有一个人问了这N个人问题的答案,有M个人说先有鸡,N-M个人 ...

  3. Flashcache基本使用及注意事项

    Flashcache基本使用及注意事项 发表回复 环境:Centos6.5 x64 minal 安装方法 Contents [hide] 1 安装方法 2 自动加载模块 3 创建Flashcache ...

  4. 取得cxgrid的表格的值,仔细看下面的代码

    procedure TfrmMain.cxGridDBTableView_List_PSSJCustomDrawCell(Sender: TcxCustomGridTableView; ACanvas ...

  5. Swagger ui测试中的验证 apikey

    Swagger ui测试中的验证 apikey 我们使用swagger 用来呈现webapi的接口,除了可以看到接口的说明和参数说明,还可以进行测试.但是我们的接口通常是有验证的,不是随便就能调用的, ...

  6. linux常用命令(一)linux开关机、重启以及文本界面与图形界面互换

    1.开关机 reboot 重启: shutdown [-efFhknr][-t 秒数][时间][警告信息] 关机: shutdown [-efFhknr][-t 秒数][时间][警告信息] 关机: - ...

  7. linux 下查看redis内存等占用量

    用客户端连接redis服务器:  ./redis-cli -h ip :port >>info server : 一般 Redis 服务器信息,包含以下域: redis_version : ...

  8. CefSharp访问需要认证网页或接口(在Request的Headers中添加认证Token)

    public class MyRequestHandler : DefaultRequestHandler { public static readonly string VersionNumberS ...

  9. Lerning Entity Framework 6 ------ Defining Relationships

    There are three types of relationships in database. They are: One-to-Many One-to-One Many-to-Many Th ...

  10. Linux学习笔记-基本操作1

    1>. 命令解析器2>. Linux快捷键3>. Linux 系统目录结构4>. 用户目录5>. 文件和目录操作6>. 文件和目录的属性7>. 文件权限, 用 ...