我有以下配置来拦截方法并在从方法返回后应用建议,但是,以下配置不起作用。你能建议我缺少什么吗?
@Service("txnEventSubscriber")
EventSubscriberImpl
...
@Resource(name="txnEventSubscriber")
private EventSubscriberImpl subscriber;
@Bean
public Advice myAdvice() {
return new AfterReturningAdvice() {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
{
System.out.println("inside advice");
}
};
}
@Bean
public ProxyFactoryBean myProxyFactoryBean() {
return new ProxyFactoryBean() {
private static final long serialVersionUID = 6296720408391985671L;
@PostConstruct
public void afterPropertiesSet() throws ClassNotFoundException {
setTarget(subscriber);
setInterceptorNames(new String[] {"myAdvice"});
}
};
}
我有EventSubscriber,在调用时和返回方法时,我需要拦截方法调用并做一些事情......在这种情况下,打印“内部建议”。
我没有看到任何例外,只是方法建议没有被调用。
答案 0 :(得分:1)
首先,我看到你的类名为EventSubscriberImpl
,并且你正在注入相同类型的类。意思是,您不是编程接口。在这种情况下,您希望setProxyTargetClass(true);
用于ProxyFactoryBean
bean,并将CGLIB放在项目的类路径中。
其次,你需要这样的东西
@Resource(name="myProxyFactoryBean")
private EventSubscriberImpl subscriber;
每当您想使用EventSubscriberImpl
的代理版本时。这意味着,您需要通过其代理bean名称显式获取该代理bean。
第三,我会使用类似的东西,以避免以代理名称获取bean:
@Resource(name="txnEventSubscriber")
private EventSubscriberImpl subscriber;
@Bean
public Advice myAdvice() {
return new AfterReturningAdvice() {
public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
{
System.out.println("inside advice");
}
};
}
@Bean
public Advisor myAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(public * com.foo.bar.EventSubscriberImpl.*(..))");
return new DefaultPointcutAdvisor(pointcut, myAdvice());
}