2012-03-12 31 views
6

Đây là sau ngày từ câu hỏi này:Enable Spring AOP hoặc AspectJ

Spring autowired bean for @Aspect aspect is null

hiểu biết ban đầu của tôi đã được rằng khi sử dụng Spring AOP, các lớp học chú thích với @Aspect được tạo ra như đậu mùa xuân quản lý, vì vậy dependency injection sẽ hoạt động như bình thường. Tuy nhiên có vẻ như một đối tượng với các chú thích @Aspect được tạo ra như một singleton bên ngoài container mùa xuân, vì vậy tôi cần phải cấu hình nó trong XML như vậy để kích hoạt nó như một lò xo được quản lý đậu:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" /> 

này bây giờ đã hoàn toàn nhầm lẫn tôi. Tôi nghĩ các cấu hình sau đây sẽ sử dụng lò xo AOP:

<context:component-scan base-package="com.mysite.aspectPackage"/> 
<aop:aspectj-autoproxy/> 

Vì vậy, nó sẽ quét các chú thích @Aspect sử dụng thành phần quét tạo đậu khía cạnh, và sau đó AutoProxy sẽ tạo ra một beanPostProcessor mà ủy nhiệm tất cả đậu trong bối cảnh của tôi với phù hợp khuyên bảo. Sau đó tôi nghĩ rằng để kích hoạt aspectJ tôi sẽ cần một cấu hình XML hoàn toàn khác nhau (mà tình cờ tôi dường như không thể tìm thấy một ví dụ trong tài liệu). Nó sẽ là cấu hình này sử dụng aspectJ để tạo ra các khía cạnh có thể nằm ngoài vùng chứa của tôi hoặc hoạt động bằng cách thao tác bytecode thay vì proxy.

Note
Đây không phải là một câu hỏi về sự khác biệt giữa AOP mùa xuân và khía cạnh J, đây là cũng có khớp nối ở đây:

Spring AOP vs AspectJ

Trả lời

5

@Component sẽ tạo ra 2 trường hợp, một bên trong container Spring, một bên trong container AspectJ.

sử dụng @Configurable để cho phép mùa xuân quản lý việc tiêm phụ thuộc, v.v. cho lớp học của bạn khi được tạo bởi vùng chứa aspectj.

@Aspect là một chú thích phong cách AspectJ được hỗ trợ bởi lò xo aop, nơi runtime dệt được sử dụng để xử lý chặn, vv

Compile-time dệt cho phép bạn bỏ qua việc sử dụng như pointcuts sẽ có mặt trong bytecode, điều này được thực hiện thông qua trình biên dịch aspectj (Xem http://mojo.codehaus.org/aspectj-maven-plugin/ để tích hợp mvn).

Cho dù bạn sử dụng trình biên dịch aspectj hay spring-aop không có sự khác biệt, nó sẽ không tạo ra khía cạnh của bạn như một bean được quản lý theo cách bạn muốn trừ khi bạn sử dụng nhà máy/cấu hình.

Cấu hình Aspectj, nghiêm chỉnh, các định nghĩa điểm cắt vv sẽ có mặt bên trong lớp học của bạn.

+0

Tôi đã thử điều này với mùa xuân 4.3 và chú thích khía cạnh với '@ Aspect'' @ Component' hoạt động hoàn toàn tốt ngay cả với DI, giống như @Bozho đã viết trong câu trả lời của mình – csharpfolk

8

@Aspect không phải là một chú thích mùa xuân, và nó không phải là được phát hiện bằng cách quét thành phần. Vì vậy, bạn phải đăng ký nó bằng cách nào đó như là một bean mùa xuân. Giải pháp aspectOf hoạt động. Bạn cũng có thể thử

@Aspect 
@Component 
+0

vậy sự khác nhau giữa cấu hình aspectJ và cấu hình AOP mùa xuân là gì? – mogronalol

+1

có hoạt động không? Tôi thấy rằng nếu tôi làm mùa xuân này tạo ra hai trường hợp của lớp và một trong đó được sử dụng như là khía cạnh không có phụ thuộc của nó tiêm. –

-1

Sử dụng

  • @Aspect
  • @Configurable

Ngoài ra thêm "< bối cảnh: mùa xuân cấu hình />" trong tập tin cấu hình XML của bạn.

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