Spring中的配置如何保证可扩展性

开发 架构
公司项目引用了一个依赖jar,配置封装太封闭了,不能扩展。业务变动一次那个jar就要跟着升级一次,而且不同的项目还引用了这个jar的不同版本。

[[399692]]

公司项目引用了一个依赖jar,配置封装太封闭了,不能扩展。业务变动一次那个jar就要跟着升级一次,而且不同的项目还引用了这个jar的不同版本。领导问我能不能给它搞成可扩展的,研究了一下,实现了可扩展定制化。

原本的配置类似是这样的:

@Configuration(proxyBeanMethods = false
public class MyConfiguration { 
 
    /** 
     * bean 
     */ 
    @Bean 
    ConfigBean configBean(Config config)  { 
        //todo 逻辑 
     return new ConfigBean(config) 
    }      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

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

发现Config对象-> 修改Config对象-> 初始化ConfigBean 
  • 1.

于是我定义了一个可以修改Config对象的接口:

@FunctionalInterface 
public interface ConfigCustomizer { 
 
    /** 
     * Customize. 
     * 
     * @param config the config 
     */ 
    void customize(Config config); 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

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

@Configuration(proxyBeanMethods = false
public class MyConfiguration { 
    private List<ConfigCustomizer> configCustomizers = Collections.emptyList(); 
    /** 
     * bean 
     */ 
    @Bean 
    ConfigBean configBean(Config config)  { 
         
        // 其它公共逻辑省略 
         
        // 最后定制逻辑注入 
        configCustomizers 
                .forEach(configCustomizer -> configCustomizer.customize(config)); 
     return new ConfigBean(config) 
    } 
     
    @Autowired(required = false
    void setConfigCustomizers(List<ConfigCustomizer> configCustomizers) { 
        this.configCustomizers = configCustomizers; 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

这样我们需要改动配置时只需要声明一个ConfigCustomizerBean即可,它会被setConfigCustomizers自动发现并执行自定义的方法。

这里会有朋友说@ConditionalOnMissingBean系列注解也能干这个事啊,没错!这样我们完全可以声明一个新的ConfigBean取而代之。但是这是两种策略:一种是修修补补就能用;一种是推到重来。我们在封装组件的时候要合理利用这些策略,该开口子的要开口子,不该开放的保持封闭,另外保证组件的扩展性也是很重要的。

本文转载自微信公众号「码农小胖哥」,可以通过以下二维码关注。转载本文请联系码农小胖哥公众号。

 

责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2021-09-02 09:42:11

测试软件可扩展性开发

2022-09-05 15:17:34

区块链比特币可扩展性

2024-10-10 14:01:34

2021-12-03 14:41:00

云存储可扩展性存储

2023-05-17 15:53:21

2010-02-26 15:07:20

WCF单例服务

2020-08-18 08:04:16

DubboSPI框架

2022-05-13 16:05:03

区块链比特币可扩展性

2012-06-04 11:04:46

虚拟化

2016-10-13 14:38:51

OpenStack可扩展性IT人员

2021-12-09 05:36:16

云存储可扩展性数据存储云存储

2009-04-20 11:33:47

光网络动态扩展

2023-10-11 13:46:26

缓存Web应用程序

2017-01-05 19:29:10

公共云云存储微软

2020-09-09 14:32:13

边缘计算

2020-04-18 11:04:35

物联网工业物联网技术

2009-04-16 17:53:09

SQL Server 应用程序扩展性

2011-08-03 09:22:25

MySQL可扩展性

2023-06-15 15:40:36

2020-04-14 12:03:49

AI扩展性机器学习
点赞
收藏

51CTO技术栈公众号