2009-05-20 32 views
8

Khi sử dụng AspectJ, tại sao sử dụng @Component trên @Configurable.Cấu hình so với Thành phần với Spring và AspectJ

Tôi đã thiết lập Spring và AspectJ cho hỗ trợ @Transactional, các khía cạnh về tự gọi và đưa vào thực thể JPA. Điều này làm việc tuyệt vời.

Tôi đang sử dụng @Component cho hầu hết các lớp cần tiêm và do đó có thể tiêm chúng vào phụ thuộc của chúng. Hoặc, khi tôi không thể, hãy tiêm ApplicationContext và sau đó sử dụng getBean() như một phương sách cuối cùng. Và tôi đang đặt @Configurable chỉ cho các thực thể JPA (Hibernate) cần tiêm. Tôi cũng đã bắt đầu sử dụng @Configurable cho các bài kiểm tra jUnit, để làm cho các bài kiểm tra viết dễ dàng. Điều này cũng hoạt động tuyệt vời.

Nhưng tôi rất tò mò. Nếu AspectJ bây giờ là tự động tiêm (beanifying) bất cứ điều gì với chú thích @Configurable, bất kể nó được xây dựng như thế nào; getBean(), new(), @Autowired. Tại sao tôi không chuyển sang sử dụng @Configurable cho tất cả các hạt của mình? Sau đó, tôi có thể loại bỏ bối cảnh ứng dụng và getBean() hoàn toàn, và chỉ mới() bất kỳ lớp nào tôi không thể tiêm.

Tôi nhận thấy rằng tôi không đề cập đến cấu hình bean XML. Tôi không né tránh điều đó, nhưng dự án này không xảy ra đòi hỏi bất kỳ điều gì. Tôi chỉ xây dựng hoặc setter tiêm phụ thuộc khi thử nghiệm. rất dễ.

Trả lời

1

Một trong những lý do tại sao bạn không nên luôn sử dụng @Configurable là nó thêm rất nhiều chi phí: thường mất nhiều thời gian hơn để ứng dụng bắt đầu và việc tạo phiên bản mới sẽ chậm hơn.

Đối với @Component bạn không cần nó chút nào, vì thông thường tất cả các phiên bản đều do Spring quản lý.

12

@Component là giao diện điểm đánh dấu mùa xuân có thể cung cấp cho các manh mối mùa xuân khi nói đến tự động phát hiện hạt.

@Configurable là điểm đánh dấu được sử dụng bởi công cụ dệt thoi thời gian tải AOP.

Hai người không thực sự có nhiều việc phải làm với nhau.

6

@Component là dành cho các lớp sẽ được khởi tạo bởi chính Spring, trong khi @Configurable là dành cho các lớp sẽ được khởi tạo bởi mã của riêng bạn, hoặc bởi khung khác - thực thể bởi Hibernate hoặc Servlet bởi thùng chứa servlet.

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