Spring Boot 中的外部包的bean引入


構建微服務架構的系統,就會出現很多相似的邏輯,比如說api的調用,數據庫的增刪改查。

所以經常需要構建一個common的jar包去抽出共通部分,加強代碼的重用。

例如:

一個message driven的信息變更推送系統。

message.pom

   - message-common.pom

   - message-process.pom

   - message-api.pom

其中message-process 與 message-api 都需要訪問數據庫 調用外部api, 而這2中邏輯都可以 在message-common中定義出來。

而在message-process 與 message-api 中的 Application.java 中只需要引入需要實例化bean的外部包名就好了,

例如:

@ComponentScan(basePackages = {"com.messge.process", "com.messge.common"})
public class MessageProcessApplication {

...

}

這樣的話common 包中的實例就可以在process中直接引用了

但是如果common中還定義了一些process中不使用的bean 該如何排除呢?

可以使用ComponentScan中的 exclude屬性排除調。

這里推薦一種更優雅的解決辦法:@Import

我們可以將common包中的bean分組放入相應的configuration文件中,然后將這個功能集的config文件 引入到process 的application.java中

例如:common中創建configuration 類

@Configuration
@EnableJpaAuditing
@EnableJpaRepositories(basePackageClasses = MessageRepo.class)
@EntityScan(basePackageClasses = MessageEntity.class)
public class MessageProcessConfig {
    

    @Bean
    public RetryHelper retryHelper(@Value("${retry.max_attempts:5}") long maxAttempts,
                                   @Value("${retry.min_backoff:50ms}") Duration minBackoff){
        return new RetryHelper(maxAttempts,minBackoff);
    }

  @Bean
    public ApiService apiService(RetryHelper retryHelper){
        return new ApiService(retryHelper);
    }
}

 而這個功能集要在process中重用,就可以:

@SpringBootApplication
@Import({MessageProcessConfig.class})
public class MessageProcessApplication {

...

}

  

這樣 common中的其他bean就不會在process啟動的時候創建。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM