2011-09-24 38 views
26

Tôi đã sau lời tuyên bố đậu:mùa xuân PropertyPlaceholderConfigurer và bối cảnh: bất động sản-placeholder

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>WEB-INF/classes/config/properties/database.properties</value> 
       <value>classpath:config/properties/database.properties</value> 
      </list> 
     </property> 
     <property name="ignoreResourceNotFound" value="true"/> 
    </bean> 
<bean id="dataSource" 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> 

Bây giờ tôi muốn thay đổi trên PropertyPlaceholderConfigurer sang định dạng sau:

<context:component-scan base-package="org.example.config"/> 
<util:properties id="jdbcProperties" 
      location="classpath:config/properties/database.properties"/> 
  1. ignoreResourceNotFound sẽ bỏ qua trong khi bất động sản đang chạy. ví dụ: Khi thử nghiệm ứng dụng WEB-INF/.. đường dẫn sẽ bỏ qua (vì maven dự án và tệp thuộc tính nằm dưới src/main/resources/..), trong khi khởi chạy ứng dụng web, tài sản khác sẽ bỏ qua đường dẫn, tôi cần để thực hiện tương tự với định dạng trên.
  2. sẽ có thể thêm nhiều tập tin bất động sản như database.properties, test.properties, vv
  3. trong mùa xuân 3, tôi có thể sử dụng chú thích thay vì những tập tin xml cho DB tải, làm thế nào tôi có thể làm điều đó? vì tôi chỉ đang sử dụng một tệp xml (được cho là ở trên) để tải công cụ db.

Tôi đang sử dụng khung công tác Spring 3.

Trả lời

42

<context:property-placeholder ... /> là XML tương đương với PropertyPlaceholderConfigurer. Vì vậy, thích điều đó. Các <util:properties/> chỉ đơn giản là nhà máy một trường hợp java.util.Properties mà bạn có thể tiêm.

Trong mùa xuân 3.1 (không 3,0 ...) bạn có thể làm một cái gì đó như thế này:

@Configuration 
@PropertySource("/foo/bar/services.properties") 
public class ServiceConfiguration { 

    @Autowired Environment environment; 

    @Bean public javax.sql.DataSource dataSource(){ 
     String user = this.environment.getProperty("ds.user"); 
     ... 
    } 
} 

Trong mùa xuân 3.0, bạn có thể "truy cập" tài sản được xác định bằng cách sử dụng cơ chế PropertyPlaceHolderConfigurer sử dụng các chú thích SpEl:

@Value("${ds.user}") private String user; 

Nếu bạn muốn loại bỏ XML tất cả cùng nhau, chỉ cần đăng ký PropertyPlaceholderConfigurer theo cách thủ công sử dụng cấu hình Java. Tôi thích cách tiếp cận 3.1. Tuy nhiên, nếu bạn đang sử dụng phương pháp Spring 3,0 (từ 3.1 không phải GA chưa ...), bạn có thể xác định tại XML trên như thế này:

@Configuration 
public class MySpring3Configuration {  
     @Bean 
     public static PropertyPlaceholderConfigurer configurer() { 
      PropertyPlaceholderConfigurer ppc = ... 
      ppc.setLocations(...); 
      return ppc; 
     } 

     @Bean 
     public class DataSource dataSource(
       @Value("${ds.user}") String user, 
       @Value("${ds.pw}") String pw, 
       ...) { 
      DataSource ds = ... 
      ds.setUser(user); 
      ds.setPassword(pw);       
      ... 
      return ds; 
     } 
} 

Lưu ý rằng UBND tỉnh được xác định bằng một định nghĩa static đậu phương pháp.Điều này là cần thiết để đảm bảo đậu được đăng ký sớm, bởi vì PPC là BeanFactoryPostProcessor - nó có thể ảnh hưởng đến việc đăng ký các hạt đậu trong bối cảnh, vì vậy nó nhất thiết phải được đăng ký trước mọi thứ khác.

+1

Nhưng một lần nữa bạn sẽ cần @Bean public static PropertySourcePlaceholderConfigurer pspc() trong Spring 3.1 example –

+1

Đây là câu trả lời hay nhất. Một lưu ý nhanh: Nếu bạn sử dụng Spring> = 3.1, hãy sử dụng PropertySourcesPlaceholderConfigurer hơn là PropertyPlaceholderConfigurer cũ. Nó hỗ trợ Môi trường và tất cả các công cụ mới được giới thiệu trong Spring 3.1 tốt hơn. –

18

Trước tiên, bạn không cần xác định cả hai vị trí đó. Chỉ cần sử dụng classpath:config/properties/database.properties. Trong WAR, WEB-INF/classes là mục nhập classpath, vì vậy nó sẽ hoạt động tốt.

Sau đó, tôi nghĩ ý của bạn là bạn muốn use Spring's schema-based configuration to create a configurer. Điều đó sẽ như sau:

<context:property-placeholder location="classpath:config/properties/database.properties"/> 

Lưu ý rằng bạn không cần phải "bỏ quaResourceNotFound" nữa. Nếu bạn cần phải xác định các đặc tính riêng biệt sử dụng util:properties:

<context:property-placeholder properties-ref="jdbcProperties" ignore-resource-not-found="true"/> 

Có thường không vì lý do nào để xác định một cách riêng biệt, mặc dù.

+0

1) nếu tôi xác định TechFind

+1

'util: properties' chỉ tạo ra một loại bean' java.util.Properties'. Nó không thay thế chỗ dành sẵn. Cách đơn giản nhất để thực hiện các thay thế là sử dụng 'context: property-placeholder' trong XML. Bạn có thể tạo và cấu hình cá thể PropertyPlaceholderConfigurer của riêng bạn mà không cần XML nếu bạn muốn - sử dụng cấu hình Java, ví dụ - nhưng tôi không chắc ai có thể xem xét một cách tiếp cận tốt hơn. –

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