在Spring中使用MethodInterceptor

时间:2014-07-16 15:59:56

标签: java spring interceptor spring-aop method-interception

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

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

我没有看到任何例外,只是方法建议没有被调用。

1 个答案:

答案 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());
}