1. 程式人生 > >Spring-boot教程(四)maven多模組 多properties所面臨的問題

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

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註解,不然不起作用。

然後在web模組的Application類上加上對data層註解類的掃描

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