gpt4 book ai didi

java - Spring - 从 application.properties 动态创建 Bean

转载 作者:行者123 更新时间:2023-12-02 03:22:58 29 4
gpt4 key购买 nike

我需要使用属性文件创建多个同名的 bean。例如:

rabbit.example.language[0]=java
rabbit.example.framework[0]=spring
rabbit.example.language[1]=python
rabbit.example.framework[1]=django

我想为每个示例索引创建一个 Bean(这最终将用于 Rabbit 队列,但我正在简化事情)。这是我迄今为止正在使用的一些代码。

兔子.java

@Configuration
@ConfigurationProperties(prefix="example")
public class Rabbits {
private String language;
private String framework;

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language= language;
}

public String getFramework() {
return framework;
}

public void setFramework(String framework) {
this.framework= framework;
}
}

属性.java

@Configuration
@ConfigurationProperties(prefix = "rabbit")
public class Properties {

@NestedConfigurationProperty
private List<Rabbits> rabbits = new ArrayList<Rabbits>();

public List<Rabbits> getRabbits() {
return rabbits;
}

public void setRabbits(List<Rabbits> rabbits) {
this.rabbits = rabbits;
}

@Bean
RabbitFlowProcessor rabbitFlowProcessor(List<Rabbits> rabbit){
return new RabbitFlowProcessor(rabbit);
}

}

RabbitFlowProcessor.java:

@Component
public class RabbitFlowProcessor implements BeanFactoryPostProcessor {

private List<Rabbits> rabbits;

public RabbitFlowProcessor(List<Rabbits> rabbits) {
this.rabbits = rabbits;
}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
rabbits.stream()
.forEach(rabbit -> {
System.out.println(rabbit.getLanguage());
});
}
}

我期望输出是 Java Python,但“兔子”返回为空。谁能告诉我哪里出错了?

最佳答案

请使用以下注释更新您的代码:

rabbit.example[0].language=java
rabbit.example[0].framework=spring
rabbit.example[1].language=python
rabbit.example[1].framework=django

由于示例将是一个列表,因此您需要为其添加索引。

<小时/>
@Configuration
@ConfigurationProperties(prefix = "rabbit")
public class RabbitsProperties {

private List<Rabbits> example = new ArrayList<Rabbits>();

public List<Rabbits> getExample() {
return example;
}

public void setExample(List<Rabbits> example) {
this.example = example;
}
}

关于 NestedConfigurationProperty 注释,该注释指示 ConfigurationProperties 对象中的字段应被视为嵌套类型。该注释与实际的绑定(bind)过程无关,但它被 spring-boot-configuration-processor 使用作为字段未绑定(bind)为单个值的提示。

<小时/>
public class Rabbits {
private String language;
private String framework;

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language= language;
}

public String getFramework() {
return framework;
}

public void setFramework(String framework) {
this.framework= framework;
}
}

通常,您可以将其添加为 RabbitsProperties 中的嵌套内部类

然后在您的 RabbitFlowProcessor.java 中,您可以像平常一样注入(inject) RabbitsProperties

@Component
public class RabbitFlowProcessor implements BeanFactoryPostProcessor {

@Autowired
private RabbitsProperties rabbitsProperties;
......
}

关于java - Spring - 从 application.properties 动态创建 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39381060/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com