Spring - використання статичних кінцевих полів (констант) для ініціалізації компонента


82

чи можна визначити компонент за допомогою статичних кінцевих полів класу CoreProtocolPNames так:


<bean id="httpParamBean" class="org.apache.http.params.HttpProtocolParamBean">
     <constructor-arg ref="httpParams"/>
     <property name="httpElementCharset" value="CoreProtocolPNames.HTTP_ELEMENT_CHARSET" />
     <property name="version" value="CoreProtocolPNames.PROTOCOL_VERSION">
</bean>

public interface CoreProtocolPNames {

    public static final String PROTOCOL_VERSION = "http.protocol.version"; 

    public static final String HTTP_ELEMENT_CHARSET = "http.protocol.element-charset"; 
}

Якщо це можливо, який найкращий спосіб це зробити?


Або видаліть запитання, або залиште його як є, але не щось середнє. Дякую.
Pascal Thivent

Відповіді:


113

Щось на зразок цього (Весна 2.5)

<bean id="foo" class="Bar">
    <property name="myValue">
        <util:constant static-field="java.lang.Integer.MAX_VALUE"/>
    </property>
</bean>

Звідки utilпоходить простір іменxmlns:util="http://www.springframework.org/schema/util"

Але для Spring 3 було б чистіше використовувати @Valueанотацію та мову виразів. Що виглядає так:

public class Bar {
    @Value("T(java.lang.Integer).MAX_VALUE")
    private Integer myValue;
}

2
також додайте розташування схеми xsi: schemaLocation = " springframework.org/schema/util springframework.org/schema/util/spring-util-3.1.xsd ">
sampath

1
Використовуючи Spring EL для конфігурації XML, це працює: # {T (com.foo.Headers) .HEADER_STATUS} відповідно до jonstefansson.blogspot.com/2011/02/…
8bitme

1
Як ми можемо позначити поле як приватне та остаточне, коли компонент анонсований анотацією?
Gunjan Shah

Ви можете пояснити, що T(Type)робить ваша @Valueанотація? Я не знайомий із цим позначенням. Я завжди користувався@Value("${my.jvm.arg.name}")
Блейк

Я все ще борюся з перевагами `` чистіших '' анотацій - проблема @Value полягає в тому, що ви повинні повторно випустити свій код, щоб змінити конфігурацію - коли за допомогою XML ви можете окремо повторно випустити конфігурацію або мати різні набори конфігурації, залежно від середовища.
Ед Рендалл,

27

Або, як альтернативу, використовуючи Spring EL безпосередньо в XML:

<bean id="foo1" class="Foo" p:someOrgValue="#{T(org.example.Bar).myValue}"/>

Це має додаткову перевагу при роботі з конфігурацією простору імен:

<tx:annotation-driven order="#{T(org.example.Bar).myValue}"/>

12

не забудьте вказати розташування схеми ..

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
     http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-3.1.xsd">


</beans>

4

Ще один приклад, який слід додати для наведеного вище екземпляру. Ось як ви можете використовувати статичну константу в bean за допомогою Spring.

<bean id="foo1" class="Foo">
  <property name="someOrgValue">
    <util:constant static-field="org.example.Bar.myValue"/>
  </property>
</bean>
package org.example;

public class Bar {
  public static String myValue = "SOME_CONSTANT";
}

package someorg.example;

public class Foo {
    String someOrgValue; 
    foo(String value){
        this.someOrgValue = value;
    }
}

1
<util:constant id="MANAGER"
        static-field="EmployeeDTO.MANAGER" />

<util:constant id="DIRECTOR"
    static-field="EmployeeDTO.DIRECTOR" />

<!-- Use the static final bean constants here -->
<bean name="employeeTypeWrapper" class="ClassName">
    <property name="manager" ref="MANAGER" />
    <property name="director" ref="DIRECTOR" />
</bean>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.