Mybatis 自定义SqlSessionFactoryBean扫描通配符typeAliasesPackage
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(); } } }