Spring @ConfigurationProperties绑定时注入指定名称@Component的实现方法
解决方案
实现逻辑非常简单,核心是通过Spring提供的@ConfigurationPropertiesBinding自定义类型转换器,将配置文件中的Bean名称自动转换为对应的Processor实例,整体步骤如下:
步骤1:补全Account类的Getter/Setter方法
@ConfigurationProperties依赖Setter方法注入属性,必须为所有字段添加public的Getter、Setter:
public class Account { String name; String key; Processor processor; // 以下是必须的Getter/Setter public String getName() { return name; } public void setName(String name) { this.name = name; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Processor getProcessor() { return processor; } public void setProcessor(Processor processor) { this.processor = processor; } }
步骤2:注册配置绑定专用的类型转换器
实现Converter接口,加上@ConfigurationPropertiesBinding注解,让Spring配置绑定时自动用这个转换器将字符串Bean名称转换为对应的Processor实例:
import org.springframework.context.ApplicationContext; import org.springframework.core.convert.converter.Converter; import org.springframework.boot.context.properties.ConfigurationPropertiesBinding; import org.springframework.stereotype.Component; @Component @ConfigurationPropertiesBinding public class ProcessorConverter implements Converter<String, Processor> { private final ApplicationContext applicationContext; // 注入Spring上下文 public ProcessorConverter(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public Processor convert(String beanName) { // 从上下文中获取指定名称的Processor类型Bean return applicationContext.getBean(beanName, Processor.class); } }
注意:如果配置文件中填写的processor名称不存在对应的Processor类型Bean,启动时会抛出
NoSuchBeanDefinitionException,属于配置校验逻辑,你可以根据业务需要在Converter中增加空值兜底逻辑。
步骤3:保留原有配置绑定逻辑即可
你之前定义的@ConfigurationProperties Bean不需要做任何修改,配置文件也按照你期望的格式编写即可:
@ConfigurationProperties(prefix = "accounts") @Bean public Map<String, Account> accounts() { return new TreeMap<>(); }
验证效果
启动项目后,从Spring上下文获取accounts这个Map Bean,遍历每个Account实例的processor字段,就能看到已经自动注入了配置中指定名称的Service1/Service2/Service3实例。
内容的提问来源于stack exchange,提问作者electrode
相关产品推荐
相关产品推荐

