2013-02-26 43 views
5

Tôi muốn tạo một Pointcut cho các phương thức riêng được chú thích với một chú thích cụ thể. Tuy nhiên, khía cạnh của tôi không được kích hoạt khi chú thích ở trên một phương thức riêng tư như dưới đây.AspectJ pointcut cho các phương thức PRIVATE có chú thích

@Aspect 
public class ServiceValidatorAspect { 
    @Pointcut("within(@com.example.ValidatorMethod *)") 
    public void methodsAnnotatedWithValidated() { 
} 

@AfterReturning(
      pointcut = "methodsAnnotatedWithValidated()", 
      returning = "result") 
    public void throwExceptionIfErrorExists(JoinPoint joinPoint, Object result) { 
     ... 
} 

Interface Dịch vụ

public interface UserService { 

    UserDto createUser(UserDto userDto); 
} 

Dịch vụ thực hiện

public class UserServiceImpl implements UserService { 

     public UserDto createUser(UserDto userDto) { 

      validateUser(userDto); 

      userDao.create(userDto); 
     } 

     @ValidatorMethod 
     private validateUser(UserDto userDto) { 

      // code here 
     } 

Tuy nhiên nếu tôi di chuyển chú thích để một giao diện công cộng phương pháp thực hiện createUser, khía cạnh của tôi được kích hoạt. Làm thế nào tôi nên xác định điểm cắt của tôi hoặc cấu hình khía cạnh của tôi để có được trường hợp sử dụng ban đầu của tôi làm việc?

Trả lời

20

8. Aspect Oriented Programming with Spring

Do tính chất proxy dựa trên khuôn khổ AOP Spring, các phương pháp bảo vệ là theo định nghĩa không bị chặn, không cho JDK proxy (nơi này không áp dụng) cũng không cho cglib proxy (nơi này về mặt kỹ thuật có thể nhưng không được khuyến nghị cho mục đích AOP). Kết quả là, bất kỳ điểm dừng nào sẽ chỉ được đối sánh với các phương thức công cộng!

Nếu nhu cầu can thiệp của bạn bao gồm các phương thức bảo mật/riêng tư hoặc thậm chí là các nhà xây dựng, hãy xem xét việc sử dụng dệt AspectJ nguyên gốc do Spring điều khiển thay vì khung AOP dựa trên proxy của Spring. Điều này tạo thành một chế độ khác nhau của việc sử dụng AOP với các đặc tính khác nhau, vì vậy hãy chắc chắn để làm cho mình quen thuộc với dệt đầu tiên trước khi đưa ra quyết định.

+0

Có ví dụ nào về điều này bạn có thể chỉ đến không? cảm ơn! –

1

Chuyển sang AspectJ và sử dụng khía cạnh đặc quyền. Hoặc thay đổi thiết kế ứng dụng của bạn để đáp ứng các hạn chế của Spring AOP. Lựa chọn của tôi sẽ là AspectJ mạnh mẽ hơn nhiều.

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