2010-06-04 41 views
9

Làm cách nào để cấu hình một thùng chứa bean Spring (hoặc ngữ cảnh ứng dụng) để tải một tệp thuộc tính Java?Làm thế nào để bạn cấu hình một thùng chứa bean Spring để tải một tệp thuộc tính Java?

JavaWorld bài viết Smartly Load Your Properties giải thích làm thế nào để tải các tập tin tài sản từ classpath bằng một trong những phương pháp chế biến tài nguyên sau trong thư viện chuẩn của Java:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties"); 
Class.getResourceAsStream ("/some/pkg/resource.properties"); 
ResourceBundle.getBundle ("some.pkg.resource"); 

Làm thế nào bạn có thể làm như vậy bằng một container đậu mùa xuân?

Trả lời

15

Các Spring Framework Reference Documentation (2.5.x) đưa ra hai ví dụ về làm thế nào để tải một tập tin bất động sản vào một container đậu, một trước khi phát hành phiên bản 2.5 và là một cách ngắn gọn hơn bằng cách sử dụng <util:properties/> chức năng đó đã được giới thiệu trong phiên bản 2.5:

Trước khi phiên bản 2.5:

<!-- creates a java.util.Properties instance with values loaded from the supplied location --> 
<bean id="jdbcConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="location" value="classpath:com/foo/jdbc-production.properties"/> 
</bean> 

Sau khi phiên bản 2.5:

<!-- creates a java.util.Properties instance with values loaded from the supplied location --> 
<util:properties id="jdbcConfiguration" location="classpath:com/foo/jdbc-production.properties"/> 

Lưu ý rằng để sử dụng <util:properties/>, bạn phải khai báo các util namespace và giản đồ vị trí trong lời mở đầu ở phía trên cùng của tập tin cấu hình XML mùa xuân của bạn:

<?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-2.5.xsd 
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> 

<!-- <bean/> definitions here --> 

</beans> 
+1

Nhìn vào giản đồ và tài liệu trong phụ lục A, rõ ràng là không. – laz

7

tập tin beans.xml của bạn nên có một PropertyPlaceholderConfigurer:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:some/pkg/resource.properties</value> 
     </list> 
    </property> 
    <!-- Default values for backwards compatibility --> 
    <property name="properties"> 
     <props> 
      <prop key="name">value</prop> 
     </props> 
    </property> 
</bean> 

Và sau đó bạn có thể tham khảo các thuộc tính như vậy ở nơi khác trong beans.xml:

<bean class="${blah}"> 
    .... 
<bean> 

Đối với một bài báo về vấn đề này, hãy kiểm tra http://almaer.com/blog/spring-propertyplaceholderconfigurer-a-nice-clean-way-to-share

+0

Không giống như các phương pháp mà tôi tham chiếu trong câu hỏi, chức năng '' và lớp 'PropertiesFactoryBean',' PropertyPlaceholderConfigurer' cách tiếp cận không làm cho các thuộc tính có thể nhìn thấy bên ngoài ngữ cảnh. –

1

Chúng tôi sử dụng điều này:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="locations"> 
     <value>classpath:test.properties</value> 
    </property> 
</bean> 

nào cho phép các thuộc tính được định nghĩa đó để được sử dụng như tài liệu tham khảo trong các tập tin cấu hình

Để biết thêm thông xem:

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

+0

Không giống như các phương thức mà tôi tham chiếu trong câu hỏi, hàm '' và lớp 'PropertiesFactoryBean', phương thức' PropertyPlaceholderConfigurer' không làm cho các thuộc tính có thể nhìn thấy bên ngoài ngữ cảnh. –

2

Có điều này được gọi là một PropertyPlaceholderConfigurer, bạn có thể sử dụng nó để bơm đậu của bạn với các giá trị từ một tập tin thuộc tính, như thế này:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:com/foo/jdbc.properties</value> 
    </property> 
</bean> 

<bean id="dataSource" destroy-method="close" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 
+0

Không giống như các phương thức mà tôi tham chiếu trong câu hỏi, hàm '' và lớp 'PropertiesFactoryBean', phương thức' PropertyPlaceholderConfigurer' không làm cho các thuộc tính có thể nhìn thấy bên ngoài ngữ cảnh. –

5

Vì ví dụ qua số PropertiesFactoryBean. Sử dụng PropertyPlaceholderConfigurer để định cấu hình các hạt trong ngữ cảnh thông qua các thuộc tính.

Bạn sẽ tìm thấy các ví dụ về PropertyPlaceholderConfigurer trong các câu trả lời khác. Dưới đây là một ví dụ PropertiesFactoryBean:

<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="location" value=classpath:config/applicationConfig.properties"/> 
</bean> 
+0

Câu trả lời của bạn là người duy nhất đề cập đến cả hai 'PropertiesFactoryBean' và' PropertyPlaceholderConfigurer'. Bạn có muốn mở rộng sự khác biệt giữa hai lớp này không? –

+5

Nếu bạn muốn tiêm một cá thể thuộc tính như là một bean, sau đó sử dụng PropertiesFactoryBean. Sử dụng PropertyPlaceholderConfigurer nếu bạn muốn parametrize đậu khác dựa trên giá trị của một tập tin thuộc tính. Tôi tin rằng ProperiesFactoryBean là những gì bạn cần ở đây. –

+0

đây là một sự khác biệt tinh tế nhưng rất quan trọng. –

1

Nếu bạn muốn tham khảo các đối tượng như một thể hiện của java.util.Properties, bạn nên làm như sau:

<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="ignoreResourceNotFound"><value>true</value></property> 
    <property name="locations"> 
     <list> 
      <value>classpath:property-file.properties</value> 
     </list> 
    </property> 
</bean> 

này cho phép bạn tham chiếu Spring bean properties như một bản sao của java.util.Properties. Bạn thậm chí có thể kết hợp nó với nhau nhiều tệp thuộc tính bằng cách thêm nhiều giá trị hơn vào location. Xem mô tả này của resource strings để biết thông tin về các loại giá trị mà Spring sẽ chấp nhận cho vị trí. Nếu bạn muốn sử dụng các thay thế kiểu ${} trong XML mùa xuân, bạn có thể thấy có một số câu trả lời khác mô tả cách thực hiện điều đó.

+0

Giải pháp này là gần gũi hơn với các phương pháp mà tôi tham chiếu trong câu hỏi của tôi và hành xử tương tự như hàm ''. –

Các vấn đề liên quan