试图弄清楚如何以带注释的方式使用 AOP 建议代理我的 bean。
我有一个简单的课程
@Service
public class RestSampleDao {
@MonitorTimer
public Collection<User> getUsers(){
....
return users;
}
}
我创建了自定义注释来监控执行时间
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorTimer {
}
并建议做一些虚假的监控
public class MonitorTimerAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable{
try {
long start = System.currentTimeMillis();
Object retVal = invocation.proceed();
long end = System.currentTimeMillis();
long differenceMs = end - start;
System.out.println("\ncall took " + differenceMs + " ms ");
return retVal;
} catch(Throwable t){
System.out.println("\nerror occured");
throw t;
}
}
}
现在,如果我像这样手动代理 dao 的实例,我可以使用它
AnnotationMatchingPointcut pc = new AnnotationMatchingPointcut(null, MonitorTimer.class);
Advisor advisor = new DefaultPointcutAdvisor(pc, new MonitorTimerAdvice());
ProxyFactory pf = new ProxyFactory();
pf.setTarget( sampleDao );
pf.addAdvisor(advisor);
RestSampleDao proxy = (RestSampleDao) pf.getProxy();
mv.addObject( proxy.getUsers() );
但是我如何在 Spring 中设置它,以便我的自定义注释方法会自动被这个拦截器代理?我想注入代理的 samepleDao 而不是真实的。可以在没有 xml 配置的情况下完成吗?
我认为应该可以只注释我想要拦截的方法,spring DI 会代理必要的东西。
还是我必须为此使用aspectj?更喜欢最简单的解决方案:-)
非常感谢您的帮助!