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?


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

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

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>

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

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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.