我正在尝试编写一个Spring FactoryBean,它将生成一个Request对象列表。请求的数量和进入它们的值在运行时是可配置的,所以我想使用这些属性。
每个请求都包含一对ID值,因此我需要一些方法为Factory Bean提供这些ID对的可配置列表(现在将它们称为A和B)。
到目前为止我所使用的是使用类似于以下内容的属性:
requests=1/2,3/4,5/6
然后定义三个请求,一个是A = 1,B = 2,一个是A = 3,B = 4,另一个是A = 5,B = 6。
这显然有点讨厌配置,而且容易出错。对于在许多属性上拆分的值做一些更好的事情,所以上面可能是这样的:
requests.1.A=1
requests.1.B=2
requests.2.A=3
requests.2.B=4
requests.3.A=5
requests.3.B=6
这让事情变得更加明显。
但是,我无法找到任何方法让我的FactoryBean配置为访问所有可用属性,而不仅仅是从上下文传入的特定命名属性。
我在这里遗漏了什么吗?或者 - 甚至更好 - 是否有更好的方法来进行这种更容易支持和维护的配置?
答案 0 :(得分:1)
您可以将Environment bean注入FactoryBean实例,它由上下文提供,您不必配置它。我不确定你是如何配置你的bean的,但我总是喜欢Java配置。所以这个例子将使用Java配置。
@Configuration
class FactoryBeanConfig {
@Bean
public FactoryBean(final Environment env) {
return new MyFactoryBean(env);
}
}
Environment实例将允许您访问所有属性,因为它是PropertyResolver您可以通过编程方式循环遍历属性
int x = 1;
while(true) {
env.getRequiredProperty("requests." + x + ".A")
env.getRequiredProperty("requests." + x + ".B")
}
答案 1 :(得分:0)
如果您想使用它来创建特定bean的实例,我建议使用PropertiesBeanDefinitionReader
。指定要加载的2个属性文件(一个用于配置默认值),另一个用于添加bean。
core-request.properties
request.(class)=com.company.pkg.Request
requests.properties
requests1.A=1
requests1.B=2
requests2.A=3
requests2.B=4
requests3.A=5
requests3.B=6
现在,您可以使用FactoryBean
构建BeanFactory
并获取所有bean并将其作为列表公开。
public class YourFactoryBean implements FactoryBean<List<Request>> {
@Autowired
private ResourceLoader rl;
public Object getObject() {
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory;
PropertiesBeanDefinitionLoader loader = new PropertiesBeanDefinitionLoader(beanRegistry);
Resource core = rl.getResource(core-location);
Resource requests = rl.getResource(requests-location);
loader.loadBeanDefinitions(core);
loader.setDefaultParentBean("request");
loader.loadBeanDefinitions(requests);
return beanRegistry.getBeansOfType(Request.class).values();
}
}
这样的事情。