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

对于多模块项目:能手动@Configration的就不要通过配置文件来处理,可以能会造成自动读取不了的问题。比如下面的问题...

一、多模块项目

这个项目分为三个模块: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:application-data.properties")注解,并配合@Value注解@Value("${spring.datasource.url}"),完成参数的注入,一定要有@Configuration注解,不然不起作用。

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

然后在web模块的Application类上加上对data层注解类的扫描

@ComponentScan("com.ucloudlink.oms.data")

 

注意:@PropertySource注解只支持xml,properties文件。而不支持yml文件。

 

 

解决方法三:使用yml文件的配置文件(以yml后缀结尾)

现在我们经常使用yml文件作为我们的配置文件。如何让各个模块使用自己的yml文件呢?

注意:@PropertySource注解只支持xml,properties文件。而不支持yml文件。

我也是尝试了好久,所以我们不能直接使用:@PropertySource(value="redis.yml")这样我们会读取不到数据,并报错,说不能解析变量占位符${spring.redis.open}。

1.    使用yml的配置文件,名称一定以application-开头,例如:application-dev.yml,application-pro.yml,application-redis.yml文件等你等。

        文件的内容:

            spring:
                redis:
                    database: 0
                    host: localhost
                    jedis:
                        pool:
                            max-active: 1000
                            max-idle: 10
                            max-wait: -1
                            min-idle: 5
                    open: true
                    password: ''
                    port: 6379

                    timeout: 1000

2.    在我们的主模块的application.yml中加入下面的一句话:

spring:
    profiles:
        active: dev,redis(这里只写application-之后的名称。多个之间用逗号分隔)

就可以了。

注意:这个方法我们必须在主模块的application.yml中加入一句话。才可以。不然找不到这个文件。
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值