开发者

reading a dynamic property list into a spring managed bean

开发者 https://www.devze.com 2023-02-16 11:32 出处:网络
I\'ve been searching but cannot find these steps. I hope I\'m missing something obvious. I have a properties file with the following contents:

I've been searching but cannot find these steps. I hope I'm missing something obvious.

I have a properties file with the following contents:

machines=A,B

I have another file like that but having a different number of members in the machines element like this:

machines=B,C,D

My question is how do I load this variable-length machines variable into a bean in my spring config in a generic way?

something like this:

<property name="machines" value="${machines}"/>

where machines is an array or list in my java code. I can define it however I want if I can figure out how to do this.

Basically I'd rather have spring do the parsing 开发者_运维问答and stick each value into a list element instead of me having to write something that reads in the full machines string and do the parsing myself (with the comma delimiter) to put each value into an array or list. Is there an easy way to do this that I'm missing?


You may want to take a look at Spring's StringUtils class. It has a number of useful methods to convert a comma separated list to a Set or a String array. You can use any of these utility methods, using Spring's factory-method framework, to inject a parsed value into your bean. Here is an example:

<property name="machines">
    <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
        <constructor-arg type="java.lang.String" value="${machines}"/>
    </bean>
</property>

In this example, the value for 'machines' is loaded from the properties file.

If an existing utility method does not meet your needs, it is pretty straightforward to create your own. This technique allows you to execute any static utility method.


Spring EL makes easier. Java:

List <String> machines;

Context:

<property name="machines" value="#{T(java.util.Arrays).asList('${machines}')}"/>


If you make the property "machines" a String array, then spring will do it automatically for you

machines=B,C,D

<property name="machines" value="${machines}"/>

public void setMachines(String[] test) {


Since Spring 3.0, it is also possible to read in the list of values using the @Value annotation.

Property file:

machines=B,C,D

Java code:

import org.springframework.beans.factory.annotation.Value;

@Value("#{'${machines}'.split(',')}")
private List<String> machines;


You can inject the values to the list directly without boilerplate code.(Spring 3.1+)

@Value("${machines}")
private List<String> machines;

for the key "machines=B,C,D" in the properties file by creating following two instance in your configuration.

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

@Bean 
public ConversionService conversionService() {
    return new DefaultConversionService();
}

Those will cover all the separate based split and whitespace trim as well.

0

精彩评论

暂无评论...
验证码 换一张
取 消