CustomSqlSessionFactoryBean
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的更多相关文章
- Spring-Mybatis配置多数据源
可以参考: http://www.cnblogs.com/ityouknow/p/6102399.html 需要一个DatabaseConfiguration类,实现 TransactionManag ...
随机推荐
- W-TinyLFU——设计一个现代的缓存
缓存设计是个基础架构领域里的重要话题,本号之前也有谈论过相关话题,点击原文可以看之前的介绍. 近日,HighScalability网站刊登了一篇文章,由前Google工程师发明的W-TinyLFU—— ...
- vue.js入门学习
可以用淘宝npm镜像 然后安装 然后初始化项目: Watch就是一个监听 v-if是如果为false就根本不在页面存在这个元素 v-show是通过display:none来控制这个元素的显示和隐藏 r ...
- Qt 中的消息对话框
1. QMessagebox 类的几个静态成员函数,可以直接调用创建对话框 StandardButton critical(QWidget * parent, const QString & ...
- 《mysql必知必会》学习_第六章_20180730_欢
第六章<过滤数据> P35 1. select prod_name,prod_price from products where prod_price=2.5; 2.select prod ...
- shell工具-sed
sed sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这 ...
- bootstrap增删改查
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- poj 2531 搜索剪枝
Network Saboteur Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u ...
- [ASE][Daily Scrum]11.10
明天就是一年一度的光棍节了 提前提醒各位已经有妹子蓝孩子藏好自己的银行卡. 涛哥上周回家去了,进度上稍有一些耽搁不过今天就能补完所以影响不严重. 此外纠正我(PM-poor man)之前一个错误,我之 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- Entity Framework Core 生成跟踪列-阴影属性
摘自:https://www.cnblogs.com/tdfblog/p/entity-framework-core-generate-tracking-columns.html Ef Core 官方 ...