2012-02-09 20 views
11

Nhìn vào sự hỗ trợ tài sản mùa xuân mới trong 3.1 (http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/), nó trông như thế này ta có thể:Xuân 3.1 PropertySourcesPlaceholderConfigurer, nhập khẩu có điều kiện

<context:property-placeholder location="/WEB-INF/application-customer-dev.properties,classpath:application-customer.properties" ignore-resource-not-found="true"/> 

<import resource="classpath*:com/x/core/security/security-${login.security}.xml"/> 

nơi login.security là trong application-customer-dev.properties như:

login.security=dev 

(và security-dev.xml không tồn tại ở nơi thích hợp). Tôi thiếu một cái gì đó mặc dù, như login.security không thể được giải quyết. Tôi mong đợi hành vi này trong các phiên bản của mùa xuân trước 3.1, nhưng có vẻ như điều này nên hợp lệ với 3.1 (mà chúng tôi đang sử dụng)?

+0

Điều gì xảy ra khi bạn dùng thử? Lỗi, không có gì, v.v. –

+0

Chỉ là lỗi nói "Không thể giải quyết thông tin đăng nhập của người giữ chỗ". –

Trả lời

3

Footnote [2] liên kết của bạn:

[2]: Bởi vì chế biến <import/> yếu tố nhất thiết phải xảy ra trước khi BeanFactoryPostProcessors được gọi, có nghĩa là thậm chí PropertyPlaceholderConfigurer không thể giúp đây. Vì môi trường và tập hợp các thuộc tính của tài sản được cấu hình trước khi làm mới vùng chứa, các phần giữ chỗ trong các phần tử có thể được giải quyết chống lại môi trường mà không có bất kỳ vấn đề vòng đời nào.

CẬP NHẬT:

Theo javadoc for PropertySourcesPlaceholderConfigurer, PropertySourcesPlaceholderConfigurer là một BeanFactoryPostProcessor, vì vậy những gì chú thích thực sự muốn nói rằng việc nhập khẩu được giải quyết trước các PropertySourcesPlaceholderConfigurer được cài đặt, vì vậy nó sẽ không làm việc hoặc (trên thực tế, tại thời điểm <import/> được giải quyết, trình cấu hình có thể chưa tồn tại!) Có, khi nó được cài đặt, nó sẽ nhìn vào Environment, nhưng bạn không thể sử dụng nó để giải quyết bên trong một <import/>, bởi vì tại thời điểm đó không người hậu xử lý là tác nhân. Và bao gồm PropertySourcesPlaceholderConfigurer.

Về cơ bản mùa xuân XML thiết lập bối cảnh đi nhiều hay ít như thế này:

  1. Bối cảnh được tạo ra.
  2. Environment được đặt.
  3. XML được đọc (tất cả XML, giải quyết nhập nếu cần). Bean định nghĩa được tạo ra.
  4. BeanFactoryPostProcessor s được cài đặt và gọi, xử lý định nghĩa bean.
  5. BeanPostProcessor s được cài đặt.
  6. Đậu được khởi tạo theo định nghĩa của hạt. BeanPostProcessors được áp dụng.

Đây là một vấn đề tương tự như gây ra mà bạn không thể sử dụng order tài sản của nhiều postprocessors để áp dụng một BeanPostProccesor trước một BeanFactoryPostProcessor (để làm một cái gì đó giống như làm một PropertyPlaceholderConfigurer placeholders quyết tâm từ một @PersistenceContext): Hành vi này là hardcoded trong bối cảnh ứng dụng Spring, vì vậy bạn phải làm việc xung quanh nó bằng cách chuyên một số lớp Spring.

+0

Có, PropertyPlaceholderConfigurer không thể giúp (như là mặc định trước mùa xuân 3.1), nhưng PropertySourcesPlaceholderConfigurer mới (mùa xuân 3.1) sẽ tìm trong môi trường để giải quyết các giá trị đó. Chú thích đó về cơ bản xác nhận nó sẽ hoạt động. –

+0

@KurtPeterschmidt Tôi đã cập nhật câu trả lời của tôi, hy vọng nó là hơi rõ ràng hơn bây giờ – gpeche

+0

Cảm ơn lời giải thích bổ sung. –

1

Tôi nghĩ rằng bạn đang đọc sai blog một chút @Kurt - Cần phải giải quyết NẾU nguồn thuộc tính có chứa thuộc tính có mặt trước khi các định nghĩa bean bắt đầu được tạo.

Vì vậy, con đường để có được nhập khẩu của bạn để giải quyết sẽ hai cách sau đây: 1. thiết lập một biến môi trường với tham số này (-Dlogin.security=dev) mà sẽ được đăng ký như là một nguồn tài sản theo mặc định
2. đăng ký một tập tin như một tài sản nguồn theo lập trình, được đề cập trong bài viết blog bằng cách viết một ApplicationContextInitializer tùy chỉnh để đăng ký nguồn tài sản của bạn - bạn sẽ có thể sử dụng ResourcePropertySource để đăng ký nguồn thuộc tính dựa trên tệp của bạn

0

Nó sẽ dễ dàng hơn nhiều so với những gì bạn cần ngay bây giờ theo @Inject Environment và sử dụng hồ sơ. Bạn không cần phải thay thế một phần của tên tệp.

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