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. hdu2710 Max Factor

    题目 //下面这个是最先用的方法,因为学姐先讲完这个,所以懒得写代码,就将就着这个用,结果搞了老半天,还是错了,心累.. #include<stdio.h> #include<str ...

  2. FastReport自动换行及行高自适应

  3. Elasticsearch 系列2 --- 安装elasticsearch-head管理工具

    elasticsearch-head是elasticsearch的一个管理页面,它的官网是https://github.com/mobz/elasticsearch-head 通过官网我们得知,ES5 ...

  4. JS学习笔记4_BOM

    1.frame相关对象 top:指向最外层框架,使用top可以在一个框架中访问另一个框架,例如top.frames[index/name] parent:指向当前框架的直接上层框架 window:代码 ...

  5. 如何在C#中引入CPLEX的dll(CPLEX系列-教程一)

    以前写在CSDN上的文章.转到博客园之后,打算把这个教程移过来,顺便完善后面的教程.主要是在Asp.Net+EF6里面使用cplex,完成一个最优生产计划的决策.当时在查找如何在C#中引用cplex时 ...

  6. [WPF]为旧版本的应用添加触控支持

    之前做WPF开发时曾经遇到这样一个需求:为一个基于 .NET Framework 3.5开发的老旧WPF程序添加触控支持,以便于大屏触控展示. 接手之后发现这是一个大坑. 项目最初的时候完全没考虑过软 ...

  7. MVVM 简化的Messager类

    看MVVMLight的Messager源码,自己实现了一个简单的Messager类. Messager类可以在MVVM中,实现View与VM.VM与VM.View与View的通信. public cl ...

  8. 2019年微服务实践第一课,网易&谐云&蘑菇街&奥思技术大咖深度分享

    微服务的概念最早由Martin Fowler与James Lewis于2014年共同提出,核心思想是围绕业务能力组织服务,各个微服务可被独立部署,服务间是松耦合的关系,以及数据和治理的去中心化管理.微 ...

  9. 用代码来细说Csrf漏洞危害以及防御

    开头: 废话不多说,直接进主题. 0x01 CSRF介绍:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session ...

  10. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...