Spring-boot教程(四)maven多模块 多properties所面临的问题

一、多模块项目

这个项目分为三个模块:web、service、data.每个模块都有自己的配置文件。

web:是controller层,大多数配置都在这里,依赖service。

data:是连接数据库,用到mybatis,所以需要配置数据库连接信息和mapper.xml文件。

service:是业务服务层,依赖data。

二、多个配置文件问题

由于一个可运行的springboot项目中只能有一个application.properties。当每个模块都各自定义application时,web层读取不到data的application。

例如:data层中配置有数据库信息,当web打成包并启动时,只会去读取web自己的application,而不会去读取data层中的application,导致数据库信息丢失,连接不到数据库...

解决方法一:

目前只知道一种解决方案:手动配置(@Configuration),将配置文件中的内容在各自的模块中先注入好...

例如:data层数据库信息和mapper文件的处理,但是这个有点问题,application.properties不是在data层,而是在web层,如果是在data层,Druid会抛NPE...如何在data层配置,请看解决方法二

mybatis的自动化配置和自动化创建, 没有支持到多模块中,这时候, 需要我们手动进行配置和创建.

MyBatis Config

@Configuration
public class MyBatisConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource(){
        return new org.apache.tomcat.jdbc.pool.DataSource();
    }

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mybatis/*.xml"));

        return sqlSessionFactoryBean.getObject();
    }
}

MyBatisMapperScanner Config

@Configuration
@MapperScan("com.luyh.projectv1.dao.mapper")
@AutoConfigureAfter(MyBatisConfig.class)
public class MyBatisMapperScannerConfig {
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        mapperScannerConfigurer.setBasePackage("com.luyh.projectv1.dao.mapper");
        return mapperScannerConfigurer;
    }
}

application.properties

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

具体实现见:https://www.cnblogs.com/elvinle/p/8177825.html

springboot多模块项目示例可以参考:https://github.com/luyunhua/spring-boot-base,我不知道它是怎么将application.properties放在data层而有效果的...

解决方法二:(有效的解决data层中配置属性)

在data中的application.properties文件更名为application-data.properties,必须得更名,不能用application.properties,可以用任何名字,就是不能用application。

在我们读取相应的配置文件使用@PropertySource注解,使用@PropertySource(value = "classpath:redis.properties")注解,并配合@Value注解@Value("${spring.redis.open}"),完成参数的注入,一定要有@Configuration注解,不然不起作用。

详情:https://blog.csdn.net/cw_hello1/article/details/79639448

猜你喜欢

转载自blog.csdn.net/wqc19920906/article/details/81569134
今日推荐