reading a dynamic property list into a spring managed bean

安稳与你 提交于 2019-11-26 18:09:00

问题


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?


回答1:


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.




回答2:


Spring EL makes easier. Java:

List <String> machines;

Context:

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



回答3:


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) {



回答4:


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;



回答5:


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.



来源:https://stackoverflow.com/questions/5274362/reading-a-dynamic-property-list-into-a-spring-managed-bean

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!