2014-05-07 17 views
7

Tôi có một lớp học mùa xuân @Configuration nên đăng ký một bean khi giá trị thuộc tính cụ thể được đặt trong môi trường. Tôi đã viết một triển khai thực hiện Condition tùy chỉnh đã kiểm tra xem giá trị có hiện diện hay không và nó hoạt động khi tôi khởi chạy ứng dụng trong Spring Boot, nhưng bean chưa bao giờ được đăng ký khi chạy các kiểm tra JUnit. Tôi đã gỡ lỗi ứng dụng và xác định rằng Condition đã được đánh giá trước khi PropertySourcesPlaceholderConfigurer được khởi tạo.Làm cách nào để trì hoãn việc đánh giá chú thích cấu hình Spring @Conditional?

Tôi đã sửa đổi Condition để triển khai ConfigurationCondition và chỉ định đánh giá trong giai đoạn REGISTER_BEAN. Phương thức này vẫn được gọi trước khi trình cấu hình được khởi tạo, nhưng bean đã đăng ký bây giờ đến và đi khi tôi thêm hoặc loại bỏ thuộc tính từ tệp thuộc tính.

Đây có phải là cách tốt nhất để sắp xếp lại đánh giá không? Đây có phải là giao diện của ConfigurationCondition dành cho hay tôi chỉ vô tình làm việc đó ngay bây giờ?

@Conditional(PropertyCondition.class) 
@Configuration 
public class PostbackUrlConfiguration { 
    @Value("${serviceName.postbackUrl}") 
    String postbackUrl; 

    @Bean 
    public PostbackUrlProvider provider() { 
     return new FixedUrlProvider(postbackUrl); 
    } 
} 

 

public class PropertyCondition implements ConfigurationCondition { 
    @Override 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
     return context.getEnvironment().containsProperty("serviceName.postbackUrl"); 
    } 

    @Override 
    public ConfigurationPhase getConfigurationPhase() { 
     return ConfigurationPhase.REGISTER_BEAN; 
    } 
} 

Cấu hình thử nghiệm là một lớp tĩnh trên trường hợp thử nghiệm của tôi:

@Configuration 
@ComponentScan 
@PropertySource("classpath:/postback.properties") 
@Import(PostbackUrlConfiguration.class) 
public static class TestConfig { 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 
+0

Bạn có đang sử dụng chú thích @ Cấu hình và @ Bean để khai báo PropertySourcesPlaceholderConfigurer trong Bài kiểm tra JUnit của mình không? –

+0

@ Jean-PhilippeBond Có, và PSPC là 'tĩnh' theo một số yêu cầu tôi thấy cho loại thành phần đặc biệt. Đã đăng lớp cấu hình thử nghiệm đầy đủ. – chrylis

Trả lời

8

Các parsing phase cho một lớp @Configuration liên quan đến reading its class definition, populating a collection of Configuration objects (because one @Configuration class may @Import another @Configuration class so these imports are parsed as well), processing @PropertySources, @ImportResources etc.

Đang xử lý @PropertySources cũng không tải các thuộc tính đó. Sau khi giai đoạn phân tích cú pháp được thực hiện, các thuộc tính @PropertySources được tải. Sau khi chúng được nạp, thì các định nghĩa của bean từ bên trong các lớp @Configuration được đăng ký (giai đoạn REGISTER_BEAN).

Vì vậy, những gì bạn thấy cách sử dụng một ConfigurationCondition với ConfigurationPhase.REGISTER_BEAN giai đoạn là bình thường vì những tài sản thực sự sẵn sàng trong Environment vào thời điểm đó khi định nghĩa đậu được đăng ký và sau khi lớp @Configuration đã được phân tích cú pháp. Chỉ sử dụng Condition Tôi tin rằng nó thậm chí không đạt đến giai đoạn phân tích cú pháp của @Configuration, việc đánh giá được thực hiện ngay cả trước đó, khi định nghĩa lớp học @Configuration phải được đăng ký.

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