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
Cảm ơn thông tin và mã ví dụ! Công trình – NightWolf