spring注解时AOP失效,XML配置<bean>正常

小呀小苹果 发布于 2014/07/15 16:57
阅读 3K+
收藏 1
Spring3使用注解方式实现AOP的时候,被代理的Customer对象使用@Service或者@Component注解时拦截失效,无法生成Cglib代理。
但是 使用Spring的XML bean标签声明Customer对象的时候是可以生成Cglib代理对象并且拦截成功的。
有人遇到过类似的问题吗?


第一种情况:

如下使用@Service注解方式声明对象,无法生成Cglib代理对象,无法拦截:

@Service
public class Customer{


    //AOP想拦截的方法
    @Cache(time=3600,key=xxxx)
    public void addInfo(){
        .......业务逻辑.........
    }

}




在Action中运行时发现这个对象不是CGlib代理对象:







第二种方式,使用 applicationContext.xml 声明这个Customer对象:
<bean id="customer" class="com.sam.demo.web.bean.Customer"/>



可以正常生成Cglib代理,也可以拦截:





我的疑问是 为什么使用@Service注解声明对象不能生成Cglib代理对象






附applicationContext.xml中AOP的配置:
<aop:aspectj-autoproxy proxy-target-class="true"/>
<context:component-scan base-package="com.sam.demo.web"/>

AOP拦截对象

@Component
@Aspect
public class CacheAspect {


    @Pointcut("@annotation(com.sam.demo.web.annotation.MyCache)")
        public void pointcut(){ 
    }


    @Around("pointcut()")
    public Object annotationAroundTest(ProceedingJoinPoint pjp){
        ..业务逻辑..
    }
}





加载中
0
excepiton
excepiton
context和aop的位置错了吧
小呀小苹果
回楼上,仅仅把<bean>标签中的对象使用@Service注解声明AOP就不能拦截了。而改回<bean>标签声明这个对象可以拦截。context和aop位置没问题。
0
hantsy
hantsy

Annotation 方式同样要在 @Configuration 启用 AspectJ AutoProxy才行。。。@EnableAspectJXXXX

BTW, Spring 已经提供了 Cache 抽象,非常易用,没必要自己去实现。

hantsy
hantsy
早就用 Spring 4 了。
小呀小苹果
谢谢你的回复。刚才看了下@EnableAspectJAutoProxy 注解是3.1版本之后的Spring才有的,我们项目目前还用3.0.5,目前还是无解。 另外这个自定义的Cache注解是有一些业务属性在里面,上面的代码示例只写了俩属性。
返回顶部
顶部