【问题标题】:AspectJ pointcut for annotated method on concrete classAspectJ 切入点,用于具体类上的注释方法
【发布时间】:2013-02-12 07:09:43
【问题描述】:

我正在使用带有 CGLIB 代理的 Spring 的 AspectJ。我有一个定义如下的方面,我希望它在使用注释“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 弹簧配置:

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

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

【问题讨论】:

  • 我建议你从 Spring AOP 切换到 AspectJ。没有代理,完全的 AOP 能力。 ;-)

标签: spring aop aspectj spring-aop


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多