这个项目分为三个模块: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中的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
然后在web模块的Application类上加上对data层注解类的扫描
@ComponentScan("com.ucloudlink.oms.data")