版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步! https://blog.csdn.net/csonst1017/article/details/85165463
最近在改一个项目,给这个项目套springboot框架,打算把项目所有的功能模块要用到的配置文件和工具类放到一个独立的module里(以下简称framework),其他module读取使用(省去了重复编写的麻烦),途中遇到很多问题,经过几个小时的琢磨,终于可以读取共享了。这里把几个关键点列出来,出错的都在这几个地方。
1.首先是springboot核心配置文件问题,我是用yml文件配置的,用properties也是一样的。
思路:把把公共module"framework"所需要的配置写在自己的module里,如图。
注意!!!:
配置文件一定要以application-XX的形式命名,不然后续配置无法识别!
打勾的是一定要配的!!!profiles: utils表示给这个配置文件起名为utils(一定要和文件名扩展名一样)。
思路:其他module的yml需要读取公共module的yml,那么需要在其他module的yml配置:
我这里只写了两个模块(framework和system),因为system这个模块是启动入口所以我直接命名application,然后再profiles属性里添加:include(或active): utils,就可以引入application-utils.yml文件的所有内容了(如果是2个有扩展名的yml配置文件之间读取的话用active会报错,只能用include),如果system模块有独立的配置也可以在application.yml后面添加,提高扩展性。
2.包的命名问题
所有module的包都要以相同的包开始,然后再在里面建各自的包。这是强制性要求,这不仅涉及到不同module的依赖相互识别问题,也涉及到父module和子module的pom关系(见下图),也方便配置文件中配置包的扫描能够在不同module条件下扫描到所有module的包。
最上面那个是父module,下面两张分别是framework和system。
3.SpringBootApplication启动类问题
framework公共module的启动类需要删除,因为不需要在工具module里启动。一般都是在web层的module启动,我这里就把system当做web的module了。
注意:启动类一定要与起始包(com.likemoney)同级!!!不然会启动错误!扫不到包!!!
4.依赖问题
在system这个module的pom里需要导入公共module framework的依赖,否则将无法使用framework里的类。
5.xml文件共享读取问题
mybatis的xml共享读取问题:
xml文件一般都是mybaits的mapper的xml,这里我们需要在framework里写一个配置数据源的config类,在这个类里面扫描mapper.xml,如果这个没有配置好的话会出现autowired无法织入mapper接口的情况。
**
* 啊里巴巴druid数据连接池配置
*
* @author gj
* @date 2018/12/19
*/
@Configuration
@MapperScan(basePackages = DataSourceConfig.PACKAGES, sqlSessionFactoryRef = "dataSqlSessionFactory")
public class DataSourceConfig {
static final String PACKAGES = "com.likemoney.dao.mapper";
private static final String MAPPER_LOCAL = "classpath*:mybatis/mapper/*.xml";
@ConfigurationProperties("spring.datasource.druid")
@Bean(name = "dataDataSource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Bean(name = "dataTransactionManager")
public DataSourceTransactionManager dataSourceTransactionManager() {
return new DataSourceTransactionManager(druidDataSource());
}
@Bean(name = "dataSqlSessionFactory")
public SqlSessionFactory dataSqlSessionFactory(@Qualifier("dataDataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCAL));
return sqlSessionFactoryBean.getObject();
}
}
把配置数据源的类写在公共module framework里,那么所有的module的mapper.xml和对应接口都能扫描到(图片当中MAPPER_LOCAL变量写错了,应该在classpath后面加个"*",这样才能多module之间互相读取,请以代码块为准)。
其他xml共享读取的问题:
其他类型xml需要把路径写进yml才行(或者properties)。
这里举例mybatis-config.xml和logback-spring.xml。
以classpath:XX/XX.xml的形式写进yml(或者properties)就行了。注意是以resources为根目录开始写,其他module必须include该utils配置文件(请看第一步)。
6.test里的启动类需要删除(打包)
test/java里默认是会有一个test启动类,如果需要把整个项目打包的话(开发项目都要),是要把它删除的,不然会启动不了springboot。
总结:这些问题是在我开发项目的时候遇到的,我在这里只是提个思路,并不代表你用了我的方法就一定能读取了,欢迎各位在评论里跟我进行讨论,必回。