Spring+Mybatis自定義SqlSessionFactoryBean掃描通配符typeAliasesPackage

        typeAliasesPackage 默認只能掃描某一個路徑下,或以逗號等分割的 幾個路徑下的內容,不支持通配符和正則,可以採用重寫的方式解決

 

實現類:

package cn.com.onethird.util;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
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;

public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean {
	static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";

    private static Logger logger = LoggerFactory.getLogger(PackagesSqlSessionFactoryBean.class);

    @Override
    public void setTypeAliasesPackage(String typeAliasesPackage) {
        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
        typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;

        //將加載多個絕對匹配的所有Resource
        //將首先通過ClassLoader.getResource("META-INF")加載非模式路徑部分
        //然後進行遍歷模式匹配
        try {
            List<String> result = new ArrayList<String>();
            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+",未找到任何包");
            }
            //logger.info("d");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

配置文件:

	<bean id="sqlSessionFactory" class="com.xxx.xxx.util.PackagesSqlSessionFactoryBean">
        <property name="configLocation" value="classpath:config.xml" />
        <property name="typeAliasesPackage" value="com.xxx.xxx.*.entity"/>
        <property name="plugins">
            <array>
                <ref bean="pageInterceptor"/>
            </array>
        </property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="co.xxxx.xxx.**.dao"/>
    </bean>

 注:/**的意思是所有文件夾及裏面的子文件夾/*是所有文件夾,不含子文件夾/是web項目的根目錄

發佈了66 篇原創文章 · 獲贊 12 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章