zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
    

      

  • 相关阅读:
    EL表达式
    单例模式
    标准标签JSTL
    五大常用算法之三:贪心算法
    python字符串处理
    判断视图存不存在
    判断插入的数据在表中存不存在
    sql因为发现对象名称 'dbo.Ct2' 和索引名称 'PK_Ct2' 有重复的键,所以ALTER TABLE ALTER COLUMN 。。。 失败。
    C# MD5算法 16 32 大小写
    制作VS2022中文离线安装包
  • 原文地址:https://www.cnblogs.com/lucia557/p/9358890.html
Copyright © 2011-2022 走看看