1

我有以下配置来拦截方法并在从方法返回后应用建议,但是,以下配置不起作用。你能建议我缺少什么吗?

@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,当它被调用和方法返回时,我需要拦截方法调用并做一些事情......在这种情况下,打印“内部建议”。

我没有看到任何异常,只是没有调用方法建议。

4

1 回答 1

2

首先,我看到你有类名,EventSubscriberImpl并且你正在注入相同类型的类。这意味着,您不是在对接口进行编程。在这种情况下,您可能希望setProxyTargetClass(true);为您的ProxyFactoryBeanbean 将 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());
}
于 2014-07-16T18:00:59.837 回答