2012-11-21 36 views
9

Tôi nghĩ lý do chính khiến nhiều chuyên gia không chuyển sang tiêm phụ thuộc chú thích là nó không hỗ trợ chuyển đổi giữa môi trường phát triển/thử nghiệm/sản xuất. Đối với các mục đích phát triển trong nhiều trường hợp, bạn không chỉ sử dụng các dịch vụ khác nhau (và các kết nối cho chúng), nhưng đôi khi bạn cần phải giả lập chúng hoặc tạo các cá thể giả.tiêm phụ thuộc chú thích xử lý các môi trường khác nhau

Hôm qua tôi đã tìm ra một giải pháp với mùa xuân chú thích:

@Value("#{${env} == "production" ? realService : dummyService}") 
    private SomeService service; 

... mà nên làm việc, nhưng không phải là tốt đẹp.

Tôi sẽ rất quan tâm đến các giải pháp của bạn, hoặc đối số: tại sao nó không phải là một vấn đề thực tế ;-) Guice, Spring, hoặc bất kỳ khác được chào đón.

Vấn đề ban đầu là một phần của chủ đề này: Spring @Autowired usage, nhưng tôi nghĩ nó đáng để tạo một chuỗi mới.

Trả lời

9

Thật không may là tôi không thể bình luận về Guice, nhưng như đã đề cập trong phần bình luận bạn có thể sử dụng hồ sơ Spring - nếu bạn đang sử dụng Spring 3.1 hoặc mới hơn.

Một Java cấu hình dựa sử dụng hồ sơ có thể giống như thế:

@Configuration 
@Profile("production") 
public class ProductionConfig { 
    @Bean 
    public SomeService someService() { ... } 
} 

@Configuration 
@Profile("dev") 
public class DevelopmentConfig { 
    @Bean 
    public SomeService someService() { ... } 
} 

Sau đó, lớp tiêu thụ của bạn sau đó trở nên đơn giản hơn nữa:

... 
@Autowired 
private SomeService someService; 
... 

Các cấu hình bạn muốn có thể, trong số những cách khác, được kích hoạt thông qua thuộc tính hệ thống:

-Dspring.profiles.active="production" 

Điều gì có thể hữu ích khi chạy ứng dụng của bạn trong các môi trường khác nhau.

Cá nhân tôi cố gắng không dựa vào hồ sơ Spring. Thay vào đó, tôi cố gắng và đóng gói các khác biệt về môi trường trong các tệp thuộc tính bên ngoài, được chuyển tới ứng dụng khi chạy. Cách tiếp cận này đã làm việc tốt cho đến nay nhưng ymmv.

-1

@Value chú thích không hoạt động theo cách bạn đã thử. Nó chỉ có thể cung cấp cho bạn các giá trị dưới dạng String. Đối với những gì bạn muốn đạt được, bạn có thể thử Hồ sơ mùa xuân theo đề xuất của @ShyJ.

Hy vọng điều này sẽ giúp bạn. Chúc mừng.

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