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. eclipse查看方法被那些代码调用open call hierarchy

    当我们编写的代码量十分巨大,项目十分复杂的时候,想要查找某一个方法都被其他那些代码调用了是一件十分困难的事,然后Eclipse提供了十分方便的方法用于查看方法都被那些代码调用了. 方法一: 选中要查看 ...

  2. 3.window窗口

    window组件依赖于draggable.resizable.panel三个组件,这三个组件的特性window都可以使用: dialog组件依赖于window.linkbutton.

  3. [logic]逻辑整理

    圈子详情页面:    1.加入圈子(*)        1.已登录,直接添加        2.未登录,登陆框    2.发表新帖(*)        1.已登录,直接跳转        2.未登录, ...

  4. Linux-IO重定向与管道

    1. 输入与输出 标准输入 STDIN 文件描述符:0,默认:键盘输入 标准输出 STDOUT 文件描述符:1,默认:屏幕输出 错误输出 STDERR 文件描述符:2,默认:屏幕输出 2. 标准输出重 ...

  5. ovs flow 命令集

    流表可以有多个执行动作,是从左向右以此执行,常用动作如下: output:port: 输出数据包到指定的端口.port 是指端口的 OpenFlow 端口编号 group:group_id 输出数据包 ...

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

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

  7. Lerning Entity Framework 6 ------ Defining the Database Structure

    There are three ways to define the database structure by Entity Framework API. They are: Attributes ...

  8. 《Linux-基础篇笔记》 Vim编辑器(二)

    Linux图形化界面下的文本编辑器 gedit . libre office . evince PDF阅读器 ①gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器.它使用GTK+编写而成, ...

  9. datatable插件使用小记

    经验,是前行路上,磕磕碰碰,不断探索,最终留下的结晶:亦是下一次,快速高效,寻求到结果的快捷方式. datatable插件具体可参考: 官网:http://datatables.club/ 参数说明: ...

  10. C#深拷贝 反射实现

    /// <summary> /// 对象拷贝 /// </summary> /// <param name="obj">被复制对象</pa ...