具体类上带注释方法的AspectJ切入点

时间:2013-02-26 17:47:05

标签: spring aop aspectj spring-aop

我使用Spring的AspectJ和CGLIB代理。我有一个方面定义如下,我希望它建议使用注释'ValidatorMethod'注释的具体类的公共方法:

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

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

示例服务接口

public interface UserService {

    UserDto createUser(UserDto userDto);
}

示例服务实现

    public class UserServiceImpl implements UserService {

       public UserDto createUser(UserDto userDto) {

             validateUser(userDto);

             userDao.create(userDto);
       }

       @ValidatorMethod
       public void validateUser(UserDto userDto) {

            // code here
       }
}

AOP spring config:

<aop:aspectj-autoproxy proxy-target-class="true"/>

据我了解,将proxy-target-class设置为“true”将导致具体类中的公共方法被代理,而不仅仅是接口方法。但是我的方面没有触发。关于什么是错的任何想法?我知道我的UserServiceImpl类正由CGLIB正确代理,因为我可以在调试器的callstack中验证它。

1 个答案:

答案 0 :(得分:0)

似乎问题是这个(取自here):

  

方面不适用于操作内呼叫。这意味着代理无法拦截调用源自同一“代理”bean的另一个方法的方法