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

发布于 2021-11-26 21:55:36 字数 1943 浏览 664 评论 5

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){
        ..业务逻辑..
    }
}





如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

小情绪 2021-11-28 18:02:26

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

温柔少女心 2021-11-28 03:48:47

早就用 Spring 4 了。

不再见 2021-11-27 17:46:20

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

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

无声静候 2021-11-27 13:28:27

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

泪冰清 2021-11-27 08:12:33

context和aop的位置错了吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文