Spring FactoryBean可以访问上下文中的所有属性吗?

时间:2015-05-28 10:51:41

标签: java spring

我正在尝试编写一个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配置为访问所有可用属性,而不仅仅是从上下文传入的特定命名属性。

我在这里遗漏了什么吗?或者 - 甚至更好 - 是否有更好的方法来进行这种更容易支持和维护的配置?

2 个答案:

答案 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();
    }

}

这样的事情。