importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importorg.apache.commons.lang3.StringUtils;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.core.io.Resource;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importorg.springframework.core.io.support.ResourcePatternResolver;importorg.springframework.core.type.classreading.CachingMetadataReaderFactory;importorg.springframework.core.type.classreading.MetadataReader;importorg.springframework.core.type.classreading.MetadataReaderFactory;importorg.springframework.util.ClassUtils;public class PackagesSqlSessionFactoryBean extendsSqlSessionFactoryBean {private static final Logger logger = LoggerFactory.getLogger(PackagesSqlSessionFactoryBean.class);static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
@Overridepublic voidsetTypeAliasesPackage(String typeAliasesPackage) {
ResourcePatternResolver resolver= (ResourcePatternResolver) newPathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory= newCachingMetadataReaderFactory(resolver);
typeAliasesPackage= ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +ClassUtils.convertClassNameToResourcePath(typeAliasesPackage)+ "/" +DEFAULT_RESOURCE_PATTERN;//将加載多個絕對比對的所有Resource//将首先通過ClassLoader.getResource("META-INF")加載非模式路徑部分//然後進行周遊模式比對
try{
List result = new ArrayList();
Resource[] resources=resolver.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 e) {
e.printStackTrace();
}
}
}
}if(result.size() > 0) {super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ","));
}else{
logger.warn("參數typeAliasesPackage:"+typeAliasesPackage+",未找到任何包");
}
}catch(IOException e) {
e.printStackTrace();
}
}
}