您的位置:首页 > 编程语言 > Java开发

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

2017-05-08 09:52 686 查看

背景

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

application.properties配置Mybatis 如下

## Mybatis 配置
mybatis.typeAliasesPackage=com.xialeme.*.*.entity
mybatis.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: