我使用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中验证它。