对于多模块项目:能手动@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中加入一句话。才可以。不然找不到这个文件。