typeAliasesPackage 默认只能扫描某一个路径下,或以逗号等分割的 几个路径下的内容,不支持通配符和正则,采用重写的方式解决
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.LoggerFactory;
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.util.ArrayList;
import java.util.List;
/**
* @author Lucia
* @description
* @date 2018/7/24
*/
public class Test extends SqlSessionFactoryBean {
static final String DEFAULT_RESOURCE_APATTERN = "**/*.class";
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(Test.class);
@Override
public void setTypeAliasesPackage(String typeAliasesPackage) {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage)
+ "/" + DEFAULT_RESOURCE_APATTERN;
try {
List<String> result = new ArrayList<String>();
//将加载多个绝对匹配的所有Resource
//将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分
Resource[] resources = resourcePatternResolver.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 e1) {
e1.printStackTrace();
}
}
}
}
if (result.size() > 0) {
super.setTypeAliasesPackage(org.apache.commons.lang3.StringUtils.join(result.toArray(), ","));
} else {
LOGGER.info("参数typeAliasesPackage:" + typeAliasesPackage + ",未找到任何包");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}