2015-02-17 30 views
5

Không có cách nào để autowire đậu trong điều kiện?Làm thế nào để autowire tài sản đậu từ Điều kiện

Có một ví dụ tiếp theo. Chúng tôi có 2 triển khai FileManager. Một trong những thực hiện nên được khởi tạo trong phụ thuộc vào 'nền tảng' thuộc tính. Thuộc tính xử lý thông qua Archaius.

@Component 
public class AwsPlatformCondition implements Condition { 

    @Autowired 
    private ArchaiusProperties archaiusProperties; 

    @Override 
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { 
     return "aws".equalsIgnoreCase(archaiusProperties.getStringProperty(PropertiesMapper.PLATFORM)); 
    } 
} 

.

@Component 
public class StandardPlatformCondition implements Condition { 

    @Autowired 
    private ArchaiusProperties archaiusProperties; 

    @Override 
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { 
     return "standard".equalsIgnoreCase(archaiusProperties.getStringProperty(PropertiesMapper.PLATFORM)); 
    } 
} 

.

@Component 
@Conditional(AwsPlatformCondition.class) 
public class AS3FileManager implements FileManager { 
... 
} 

.

@Component 
@Conditional(StandardPlatformCondition.class) 
public class NativeFileManager implements FileManager { 
... 
} 

Mã này không hoạt động. Lý do chính là vì hạt ArchaiusProperties không được khởi tạo khi điều kiện phù hợp. Có cách nào để khởi tạo bean ArchaiusProperties trước khi sử dụng nó trong điều kiện không?

Trả lời

4

Nếu chúng ta có một cái nhìn tại java docs cho giao diện Condition -

điều kiện phải tuân theo các hạn chế tương tự như BeanFactoryPostProcessor và chăm sóc để không bao giờ tương tác với các trường hợp đậu.

Các hạn chế là (từ java docs của BeanFactoryPostProcessor)

Một BeanFactoryPostProcessor thể tương tác với và sửa đổi các định nghĩa bean, nhưng không bao giờ trường hợp đậu. Làm như vậy có thể gây ra hiện tượng đậu sớm, vi phạm vật chứa và gây ra các tác dụng phụ không mong muốn.

Vì vậy, những gì bạn đang cố gắng đạt được là một cái gì đó không được đề xuất; tác dụng phụ đã gặp phải.

Tuy nhiên nếu chúng ta đào thêm trong tài liệu cho Condition chúng tôi nhận

Để biết thêm kiểm soát hạt mịn các điều kiện tương tác với @Configuration đậu xem xét giao diện ConfigurationCondition.

Ở đây cũng như các hạn chế đều vi phạm. Vì vậy, tất cả trong tất cả sử dụng Condition trong kịch bản này không phải là một ý tưởng tốt.

Vì vậy, IMO đặt cược tốt nhất cho bạn là đi với @Profile nơi bạn có thể kích hoạt cấu hình mong muốn tại một thời điểm và sử dụng bean tương ứng; mà không xem xét các kiểu đính kèm.

+1

Cảm ơn! Bây giờ tôi thực sự nghĩ rằng @Conditional không phải là cách tốt nhất cho tôi. – biven

+0

Đặt cấu hình sẽ phụ thuộc vào kết quả được trả về từ phương thức trong bean 'ArchaiusProperties'. Làm thế nào là nó có thể? Ngoài ra, không Javadoc trích dẫn nói rằng bạn thực sự có thể tham khảo các bean bên trong 'ConfigurationCondition'? –

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