Spring - sử dụng các trường cuối cùng tĩnh (hằng số) để khởi tạo bean


81

có thể định nghĩa bean bằng cách sử dụng các trường cuối cùng tĩnh của lớp CoreProtocolPNames như thế này không:


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

Nếu có thể, cách tốt nhất để làm điều này là gì?


Xóa câu hỏi hoặc để nguyên, nhưng không xóa câu hỏi ở giữa. Cảm ơn.
Pascal Thivent

Câu trả lời:


113

Một cái gì đó như thế này (Mùa xuân 2.5)

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

Không utilgian tên đến từ đâuxmlns:util="http://www.springframework.org/schema/util"

Nhưng đối với Spring 3, sẽ gọn gàng hơn nếu sử dụng @Valuechú thích và ngôn ngữ diễn đạt. Trông như thế này:

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

2
cũng thêm vị trí schema xsi: schemaLocation = " springframework.org/schema/util springframework.org/schema/util/spring-util-3.1.xsd ">
Sampath

1
Sử dụng Spring EL cho cấu hình XML của bạn, điều này hoạt động: # {T (com.foo.Headers) .HEADER_STATUS} theo jonstefansson.blogspot.com/2011/02/…
8bitme

1
Làm thế nào chúng ta có thể đánh dấu một trường là riêng tư và cuối cùng khi bean được khai báo bởi Annotation?
Gunjan Shah,

bạn có thể giải thích những gì T(Type)không trong @Valuechú thích của bạn ? Tôi không quen với ký hiệu đó. Tôi đã luôn luôn sử dụng@Value("${my.jvm.arg.name}")
Blake

Tôi vẫn đang đấu tranh với những lợi ích của chú thích 'sạch hơn' - rắc rối với @Value là bạn phải phát hành lại mã của mình để thay đổi cấu hình - trong trường hợp sử dụng XML, bạn có thể phát hành lại cấu hình một cách riêng biệt hoặc có các bộ cấu hình, tùy thuộc vào môi trường.
Ed Randall

26

Hoặc, để thay thế, sử dụng Spring EL trực tiếp trong XML:

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

Điều này có lợi thế bổ sung khi làm việc với cấu hình không gian tên:

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

12

đừng quên chỉ định vị trí lược đồ ..

<?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

Thêm một ví dụ nữa cho ví dụ trên. Đây là cách bạn có thể sử dụng hằng số tĩnh trong bean bằng 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.