spring注解时AOP失效,XML配置<bean>正常
Spring3使用注解方式实现AOP的时候,被代理的Customer对象使用@Service或者@Component注解时拦截失效,无法生成Cglib代理。
但是 使用Spring的XML bean标签声明Customer对象的时候是可以生成Cglib代理对象并且拦截成功的。
有人遇到过类似的问题吗?
第一种情况:
第二种方式,使用 applicationContext.xml 声明这个Customer对象:
我的疑问是 为什么使用@Service注解声明对象不能生成Cglib代理对象?
附applicationContext.xml中AOP的配置:
但是 使用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"/>
我的疑问是 为什么使用@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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
谢谢你的回复。刚才看了下@EnableAspectJAutoProxy 注解是3.1版本之后的Spring才有的,我们项目目前还用3.0.5,目前还是无解。 另外这个自定义的Cache注解是有一些业务属性在里面,上面的代码示例只写了俩属性。
早就用 Spring 4 了。
Annotation 方式同样要在 @Configuration 启用 AspectJ AutoProxy才行。。。@EnableAspectJXXXX
BTW, Spring 已经提供了 Cache 抽象,非常易用,没必要自己去实现。
回楼上,仅仅把<bean>标签中的对象使用@Service注解声明AOP就不能拦截了。而改回<bean>标签声明这个对象可以拦截。context和aop位置没问题。
context和aop的位置错了吧