Springboot+mybatis实现typeAliasesPackage正则扫描package中的bean

来源:互联网 发布:mysql insert语法 编辑:程序博客网 时间:2024/05/17 22:15

背景

mybatis默认typeAliasesPackage是不支持正则扫描package的,因此需要手动继承自己实现正则扫描,方法和传统的spring+mybatis没什么区别唯一不同的是一个需要继承类一个是使用的扫描实现。
application.properties配置Mybatis 如下

## Mybatis 配置 mybatis.typeAliasesPackage=com.xialeme.*.*.entitymybatis.mapperLocations=classpath:mapper/*.xml

我项目中的bean存放位置
com.xialeme.commoncore.common.entity
ResultInfo.java
com.xialeme.project.sysconfig.entity
SysMessageTep.java

实现自己的MyBatisConfig

package com.xialeme.xmwebapi.base;import java.io.IOException;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Properties;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;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 com.Application;/** *    *  * @Title: MyBatisConfig.java  * @Package com.xialeme.xmwebapi.base  * @Description: mybtis实现正则扫描java bean包 * @author bamboo  <a href= *         "mailto:zjcjava@163.com?subject=hello,bamboo&body=Dear Bamboo:%0d%0a描述你的问题:" *         >Bamboo</a>    * @date 2017年4月26日 下午2:15:02  * @version V1.0    */@Configuration@PropertySource("classpath:application.properties")public class MyBatisConfig {    @Autowired    private Environment env;    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";    public static String 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;        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 {                            // System.out.println(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());                            result.add(Class                                    .forName(                                            metadataReader.getClassMetadata()                                                    .getClassName())                                    .getPackage().getName());                        } catch (ClassNotFoundException e) {                            e.printStackTrace();                        }                    }                }            }            if (result.size() > 0) {                HashSet<String> h = new HashSet<String>(result);                result.clear();                result.addAll(h);                typeAliasesPackage=String.join(",",(String[]) result.toArray(new String[0]));                System.out.println(typeAliasesPackage);            } else {                throw new RuntimeException(                        "mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:"                                + typeAliasesPackage + "未找到任何包");            }        } catch (IOException e) {            e.printStackTrace();        }        return typeAliasesPackage;    }    @Bean    public SqlSessionFactory sqlSessionFactory(DataSource dataSource)            throws Exception {        System.out                .println(">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]START>>>>>>>>>>>>>>");        Properties props = new Properties();        String typeAliasesPackage = env                .getProperty("mybatis.typeAliasesPackage");        String mapperLocations = env.getProperty("mybatis.mapperLocations");        typeAliasesPackage=setTypeAliasesPackage(typeAliasesPackage);        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();        sessionFactory.setDataSource(dataSource);        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));        System.out                .println(">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]END>>>>>>>>>>>>>>");        return sessionFactory.getObject();    }    public static void main(String[] args) throws Exception {        setTypeAliasesPackage("com.xialeme.**.entity");    }}

直接运行main方法看看是否符合我们的预想,我这里是直接输出了包路径,说明配置已经成功。

com.xialeme.commoncore.common.entity,com.xialeme.project.sysconfig.entity
0 0
原创粉丝点击