如何重构Spring Boot中多个相似的配置类?
如何重构仅常量不同的Spring配置类?
当然可以重构,这种重复代码的场景最适合用抽象基类提取通用逻辑的方式,既保留原有配置类的结构,又能消除重复。下面是具体实现方案:
方案:抽象基类+子类继承
先把两个配置类里的通用逻辑抽成抽象基类,将可变的CONFIG_STRING通过抽象方法暴露给子类实现:
抽象基类(处理通用Bean逻辑)
public abstract class BaseConfig { // 由子类提供具体的配置标识字符串 protected abstract String getConfigString(); // 用SpEL动态拼接Bean名称 @Bean(name = "#{'first' + getConfigString()}") public First first() { // 这里写原来两个配置类里first()的通用逻辑 ... } @Bean(name = "#{'second' + getConfigString()}") public Second second() { // 这里写原来两个配置类里second()的通用逻辑 ... } }
子类(仅指定唯一常量)
@Configuration public class ConfigA extends BaseConfig { private static final String CONFIG_STRING = "configA"; @Override protected String getConfigString() { return CONFIG_STRING; } } @Configuration public class ConfigB extends BaseConfig { private static final String CONFIG_STRING = "configB"; @Override protected String getConfigString() { return CONFIG_STRING; } }
关键细节说明
- 这里用Spring的SpEL表达式
#{'first' + getConfigString()}来动态生成Bean名称,因为父类无法直接引用子类的静态常量,通过调用子类实现的抽象方法可以正确获取到各自的配置字符串。 - 后续如果新增类似的配置类,只需要继承
BaseConfig并实现getConfigString()方法即可,完全不用重复写Bean的创建逻辑。 - Spring对
@Configuration类的继承是完全支持的,子类依然会被当作配置类正常扫描和处理。
内容的提问来源于stack exchange,提问作者Rurien
相关产品推荐
相关产品推荐

