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启动的时候创建。

 

posted on 2020-11-20 21:34  涤生-三省吾身  阅读(1232)  评论(0编辑  收藏  举报

导航