2010-03-18 27 views
5

Tôi đã chú thích các lớp của mình bằng chú thích @Repository, @Resource, @Component, @Service nhưng các lớp này phải chạy trong 2 môi trường. Môi trường đầu tiên là Spring 2.x trong khi môi trường khác không có mùa xuân chút nào. Tôi chắc chắn rằng mã sẽ không thành công nếu không có các jars xuân & Tôi muốn biết các ý tưởng của bạn về cách tôi có thể giữ lại các chú thích nhưng vẫn hoạt động trong cả hai môi trườngPhụ thuộc vào chú thích của mùa xuân

Trả lời

0

Vì bạn không thể xóa bài được chấp nhận, tôi đề nghị bạn đọc bài/bỏ phiếu Hans', mà là một lời giải thích tốt hơn nhiều so với bản gốc của tôi: Dependency on Spring's annotations


Khi sử dụng các chú thích định kiến ​​(@Service vv), sự cân bằng để đạt được xác nhận hợp lệ thời gian biên dịch là bạn trở nên kết hợp với thư viện bối cảnh mùa xuân trong mã của bạn. Tôi thấy 3 tùy chọn ngay lập tức:

1) Xóa chú thích và định cấu hình hạt của bạn trong XML.

2) Sao chép spring-context.jar (hoặc thư viện tương đương giữ chú thích khuôn mẫu của bạn) vào dự án không phải Spring của bạn để giải quyết các phụ thuộc, nhưng để Spring không được định cấu hình để nó không được sử dụng trong mã của bạn.

3) Xóa chú thích khỏi các lớp cụ thể của bạn và mở rộng chúng bằng các phiên bản "Spring". Cách tiếp cận này có thể hoặc không thể là một ít xâm lấn để thiết kế của bạn, nhưng đáng xem xét:

public class MyDAO { 
    protected SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    // .. Your DAO code resides here .. 
} 

Và mùa xuân sub-class:

@Repository 
public class MySpringDAO extends MyDAO { 

    @AutoWired 
    protected SessionFactory sessionFactory; 
} 

Bằng cách này, dự án phi mùa xuân của bạn có thể sử dụng " MyDAO "và loại trừ lớp" MySpringDAO "khỏi bản dựng.

+0

Tôi đã chọn số 2 và hoạt động tốt. –

+0

Cảm ơn bạn Sean, đó là duyên dáng của bạn. –

1

Đối với mọi chú thích trong Java, có một tệp lớp tương ứng. Nếu bạn tìm ra chú thích nào bạn sử dụng, bạn có thể sao chép tệp lớp học sang môi trường khác.

Tôi không chắc chắn liệu các lớp này có phụ thuộc vào các lớp khác aswel hay không; chúng có thể không, vì chú thích là các đối tượng chỉ có dữ liệu không thay đổi. Nếu lớp này cũng có các phương thức, bạn có thể biên dịch lại (với cùng một ID tuần tự hóa) các nguồn chú thích mà không có các phương thức (tức là chỉ các trường) để sử dụng trong môi trường khác.

5

Để có thể sử dụng chú thích mà bạn đề cập hoặc thực sự, hãy để Spring sử dụng chúng để bạn có được lợi ích, bạn cần sử dụng ít nhất là Spring 2.5.x, đó là khi chúng được giới thiệu.

Hơn nữa, chú thích không bắt buộc phải nằm trên đường dẫn lớp. Họ sẽ bị bỏ qua. Vì khi bạn đang sử dụng spring 2.0, sẽ không có mã nào cố gắng 'quét' cho chúng.

+0

Bạn vẫn có phụ thuộc thời gian biên dịch trên các chú thích đó. Và vì các tệp .class của bạn có các chú thích được biên dịch trong tôi giả định rằng bạn sẽ cần các tệp .class của chú thích cũng như trên đường dẫn lớp của bạn. Đó không phải là trường hợp? –

+1

Nope :) để xác minh nó tôi vừa thử nghiệm. Tôi tạo ra một dự án nhỏ, với một chính(). Lớp được chú thích bằng MyAnnotation mà tôi đã viết. Tôi đã chạy nó trên dòng lệnh, sau đó xóa thủ công tệp .class cho chú thích và chạy lại nó. Nó vẫn hoạt động. Hãy thử nó cho mình :) Tâm trí bạn chú thích của tôi đã được chú thích nó tự với @Retention (RetentionPolicy.RUNTIME) –

+0

Rất tốt để biết thực sự ... –

0

Nó sẽ không là mùa xuân nếu nó buộc bạn phải làm cho các lớp học của bạn trực tiếp phụ thuộc vào nó.

Bạn có thể xác định các chú thích của riêng bạn phục vụ cùng mục đích với các mục được xác minh mùa xuân. I E. xác định com.yourcompany .... Thành phần, v.v.

Tôi giả định rằng bạn sử dụng một số <context:component-scan .../> ở đâu đó trong cấu hình mùa xuân của mình. Chỉ cần thêm use-default-filters="false" và xác định bộ lọc của riêng bạn để khớp với chú thích của bạn.

Tìm những người hậu xử lý thực sự thực hiện công việc grunt.Chúng có thể được định cấu hình để sử dụng một bộ chú thích thay thế. @Repository được kiểm tra bởi PersistenceExceptionTranslationPostProcessor. PostProcessor này có thể được cấu hình để sử dụng tương đương với chú thích.

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