• 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();
            }
        }
    }
    

      

  • 相关阅读:
    Nginx 知识
    web页面乱码之字符集
    P2633 Count on a tree 树上主席树
    HDU 1542 线段树扫描线
    P4513 小白逛公园 线段树
    牛客4 C sequence
    P4126 [AHOI2009]最小割 网络流
    P3980 [NOI2008]志愿者招募 网络流
    P3313 [SDOI2014]旅行 动态开点线段树 树链剖分
    Planting Trees 单调队列
  • 原文地址:https://www.cnblogs.com/lucia557/p/9358890.html
Copyright © 2020-2023  润新知