Spring - Verwendung statischer Endfelder (Konstanten) für die Bean-Initialisierung

81

Ist es möglich, eine Bean mithilfe statischer Endfelder der CoreProtocolPNames-Klasse wie folgt zu definieren:


<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"; 
}

Wenn es möglich ist, wie geht das am besten?

lisak
quelle
Löschen Sie die Frage oder lassen Sie sie unverändert, aber nicht dazwischen. Vielen Dank.
Pascal Thivent

Antworten:

113

So etwas wie das (Frühling 2.5)

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

Woher kommt der utilNamespace?xmlns:util="http://www.springframework.org/schema/util"

Für Spring 3 wäre es jedoch sauberer, die @ValueAnnotation und die Ausdruckssprache zu verwenden. Welches sieht so aus:

public class Bar {
    @Value("T(java.lang.Integer).MAX_VALUE")
    private Integer myValue;
}
Paul McKenzie
quelle
2
Fügen Sie auch den Schema-Speicherort xsi hinzu: schemaLocation = " springframework.org/schema/util springframework.org/schema/util/spring-util-3.1.xsd ">
sampath
1
Mit Spring EL für Ihre XML-Konfiguration funktioniert dies: # {T (com.foo.Headers) .HEADER_STATUS} gemäß jonstefansson.blogspot.com/2011/02/…
8bitme
1
Wie können wir ein Feld als privat und endgültig markieren, wenn Bean durch Annotation deklariert wird?
Gunjan Shah
Können Sie erklären, was das T(Type)in Ihrer @ValueAnmerkung tut ? Diese Notation ist mir nicht vertraut. Ich habe immer verwendet@Value("${my.jvm.arg.name}")
Blake
Ich habe immer noch Probleme mit den Vorteilen von "saubereren" Anmerkungen - das Problem mit @Value ist, dass Sie Ihren Code erneut freigeben müssen, um die Konfiguration zu ändern. Wenn Sie XML verwenden, können Sie die Konfiguration separat erneut freigeben oder über verschiedene Sätze von verfügen Konfigurationen, abhängig von der Umgebung.
Ed Randall
26

Alternativ können Sie Spring EL auch direkt in XML verwenden:

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

Dies hat den zusätzlichen Vorteil, mit der Namespace-Konfiguration zu arbeiten:

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

Vergessen Sie nicht, den Speicherort des Schemas anzugeben.

<?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>
Sampath
quelle
4

Ein weiteres Beispiel für die obige Instanz. So können Sie mit Spring eine statische Konstante in einer Bean verwenden.

<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;
    }
}
Balaji Boggaram Ramanarayan
quelle
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>
Chetan Singhal
quelle