Notes-Spring中的配置保证可扩展性-《Java笔记》

admin 2025-10-19 04:26:53 编程 来源:ZONE.CI 全球网 0 阅读模式

    Java Spring项目引用了一个依赖jar,配置封装太封闭了,不能扩展。业务变动一次那个jar就要跟着升级一次,而且不同的项目还引用了这个jar的不同版本。所以通过可扩展定制化实现可以很好的提高效率。原本的配置类似是这样的:

    1. @Configuration(proxyBeanMethods = false)
    2. public class MyConfiguration {
    3. /**
    4. * bean
    5. */
    6. @Bean
    7. ConfigBean configBean(Config config) {
    8. //todo 逻辑
    9. return new ConfigBean(config)
    10. }
    11. }

    如果想根据项目的不同定制不同的ConfigBean就不太好弄了。如果能在Config对象传入ConfigBean构造之前放一个修改Config的口子就好了。这样ConfigBean的初始化生命周期也变成了 :::info 发现Config对象-> 修改Config对象-> 初始化ConfigBean ::: 于是定义了一个可以修改Config对象的接口:

    1. @FunctionalInterface
    2. public interface ConfigCustomizer {
    3. /**
    4. * Customize.
    5. *
    6. * @param config the config
    7. */
    8. void customize(Config config);
    9. }

    上面整个配置就变成这样的了:

    1. @Configuration(proxyBeanMethods = false)
    2. public class MyConfiguration {
    3. private List<ConfigCustomizer> configCustomizers = Collections.emptyList();
    4. /**
    5. * bean
    6. */
    7. @Bean
    8. ConfigBean configBean(Config config) {
    9. // 其它公共逻辑省略
    10. // 最后定制逻辑注入
    11. configCustomizers
    12. .forEach(configCustomizer -> configCustomizer.customize(config));
    13. return new ConfigBean(config)
    14. }
    15. @Autowired(required = false)
    16. void setConfigCustomizers(List<ConfigCustomizer> configCustomizers) {
    17. this.configCustomizers = configCustomizers;
    18. }
    19. }

    这样需要改动配置时只需要声明一个ConfigCustomizerBean即可,它会被setConfigCustomizers自动发现并执行自定义的方法。这里会有朋友说@ConditionalOnMissingBean系列注解也能干这个事啊,没错!这样完全可以声明一个新的ConfigBean取而代之。但是这是两种策略:一种是修修补补就能用;一种是推倒重来。在封装组件的时候要合理利用这些策略,该开口子的要开口子,不该开放的保持封闭,另外保证组件的扩展性也是很重要的。

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  14