Spring Boot 中的外部包的bean引入
阿新 • • 發佈:2020-11-21
構建微服務架構的系統,就會出現很多相似的邏輯,比如說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啟動的時候建立。