2011-08-28 39 views
29

Nếu tôi có 2 .properties tập tin cài đặt trong XML mùa xuân của tôi như vậy:Xuân Util: Thuộc tính tiêm qua chú thích vào một bean

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/> 
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/> 

Làm thế nào tôi có thể tiêm qua tệp chú thích các đặc tính này vào một bean với java.util.Properties?

Làm cách nào để lấy các thuộc tính cụ thể thông qua chú thích mùa xuân?

Chúc mừng!

Trả lời

44
@Autowired 
@Qualifier("serverProperties") 
private Properties serverProperties; 
@Autowired 
@Qualifier("someConfig") 
private Properties otherProperties; 

hoặc

@Resource(name = "serverProperties") 
private Properties serverProperties; 
@Resource(name = "someConfig") 
private Properties otherProperties; 

Thông thường, @Autowired được sử dụng cho từng loại autowiring trong mùa xuân, và @Resource được sử dụng cho từng tên. @ Autowired + @ Qualifier có thể tăng gấp đôi theo tên autowiring, nhưng nó thực sự có nghĩa là cho autowiring bằng loại với khả năng fine-tune the type.

+0

Cảm ơn thông tin và mã ví dụ! Công trình – NightWolf

2

Bạn có thể sử dụng @PropertySource

@Configuration 
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"}) 
public class MyConfiguration { 
} 
+0

Điều này là tốt đẹp, nó giúp loại bỏ sự cần thiết cho cấu hình XML hoàn toàn. – bluecollarcoder

15

Như câu hỏi này có rất nhiều lượt truy cập. Tôi nghĩ rằng nó sẽ là đáng giá để chỉ ra một tùy chọn khác sử dụng Spel (Spring Expression Language) - nếu bạn cần các thuộc tính cụ thể, chúng có thể được tiêm bằng cách sử dụng chú thích @Value trên các thuộc tính bean cụ thể;

class SomeClass { 
    @Value("#{serverProperties['com.svr.prop']}") 
    private String aServerCfgProperty; 

    @Value("#{someConfig['another.config.setting']}") 
    private String someOtherProperty; 
} 

Bạn không cần sử dụng cú pháp lập chỉ mục ['index.val'] bạn chỉ có thể lấy trực tiếp;

@Value("#{someConfig}") 
private Properties someConfig 

@Value("#{serverProperties}") 
private Properties svrProps; 

Tôi đã tìm thấy điều này khá hữu ích và bị loại bỏ khỏi việc sử dụng đối tượng thuộc tính được tiêm trực tiếp qua @ Resource/@ Autowired.

Một lý do hay khác để sử dụng đối tượng Thuộc tính được lập chỉ mục là một số IDE (ví dụ: IntelliJ) có thể cấu trúc lại tên thuộc tính thực nếu bạn cũng có tệp .properties trong dự án đẹp. Một mẹo khác là sử dụng một cái gì đó như EProperties (mở rộng đối tượng thuộc tính Java) nếu bạn muốn bao gồm/lồng/thay thế trong các tệp thuộc tính mà không sử dụng lớp PropertiesPlaceholderConfigurer của Spring (mà thật không buồn phơi bày các thuộc tính của nó - sử dụng chỉ mục Spel ['key'] bean) cần phải là một thể hiện của Map<> tức là mở rộng bản đồ mà đối tượng thuộc tính Java thực hiện) ...

Cuối cùng, một tính năng gọn gàng khác với SpEL là bạn có thể truy cập trực tiếp các thuộc tính của hạt. Ví dụ: nếu SomeClass trong ví dụ trên là một bean Spring, ví dụ: someClass sau đó trong AnotherBeanClass chúng tôi có thể có;

@Value("#{someClass.someOtherProperty}") 
private String injectedBeanProp 

Bạn cũng có thể gọi một phương thức getter:

@Value("#{someClass.getSomeOtherProperty()}") 
private String injectedBeanProp 

Xem hướng dẫn SpEL đây; http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions

+1

Chỉ cần ghi chú Spel là trong Mùa xuân 3+ – NightWolf

+0

Thêm tại đây; http://blog.nemccarthy.me/?p=304 – NightWolf

+0

Tôi chỉ nhận được giá trị null cho chú thích @Value !!! –

0

Hầu hết thời gian tôi gói gọn tất cả các thuộc tính vào một tiện ích và được sử dụng trong ứng dụng của tôi. Bằng cách đó, bạn không cần phải lo lắng/quản lý từng tệp thuộc tính trong lớp ứng dụng. SetProps tự động (...) đọc tất cả những gì bạn đã tải util: các thuộc tính vào danh sách đạo cụ.

import java.util.List; 
import java.util.Properties; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

@Component 
public class AppProperiesProcessor { 

private List<Properties> props; 
private Properties mergedProperties; 

@Autowired 
public final void setProps(List<Properties> props) { 
    this.props = props; 
} 

public String getProp(final String keyVal) { 

    if (null == this.mergedProperties) { 
     this.mergedProperties = new Properties(); 

     for (Properties prop : this.props) { 
      this.mergedProperties.putAll(prop); 
     } 
    } 
    return mergedProperties.getProperty(keyVal); 
    } 
} 
1

tập tin XML

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util-4.0.xsd"> 
    <context:component-scan base-package="com.sha.home" /> 
    <mvc:annotation-driven/> 
    <util:properties id="dbProp" location="classpath:db.properties" /> 
    <!-- <context:property-placeholder location="classpath:db.properties"/> --> 

</beans> 

trong file java @value ("# {dbProp}") tin Thuộc tính dbProperties;

System.out.println ("urllll" + dbProperties.getProperty ("jdbc.url"));

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