構建微服務架構的系統,就會出現很多相似的邏輯,比如說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啟動的時候創建。
