aop:aspectj-autoproxy 致使autowired失效
来源:互联网 发布:小牛学堂大数据就业班 编辑:程序博客网 时间:2024/04/27 23:55
对Struts1/2 Action应用Spring AOP问题小结
之前使用SSH三大经典框架的时候,写了一个简单的统计Action每个方法执行时间的功能类,代码如下:
在applicationcontext.xml加入以下配置:
就可以正确地以AOP的方式完成原本比较繁琐的功能了。
最近把框架升级到SS2H,顺便把Spring AOP实现由原来的Schema方式改为AspectJ方式,代码如下:
struts.xml内容如下:
在applicationcontext.xml加入以下配置:
理论上讲,AOP的功能应该可以正确实现了,实际则不然,以UserAction举例说明,
测试的结果是,userManager注入失败,在执行list()方法的时候报错,NullPointer!
接下来反复Debug后,发现个很奇怪的现象,在AOP执行的RunTimeHandler内部,Debug视图中methodInvocation的proxy的userManager属性是正确地注入的,而其target中的userManager却为null,当跳转到list()时,userManager亦为null,这是怎么回事呢?!
变换了几种测试方法,发现如果是对service层的EntityManager(里面有使用了@Autowired的entityDAO)切面,不会出现NPE,Debug视图中proxy的entityDAO为null而target中的entityDAO正确注入;如果去掉AOP,UserAction运行正常,不会发生userManager注入失败的情况;但是该AOP在Struts1的环境下却执行正确,也没有发生注入失败的问题!
尝试了几种解决方案后,发现如果加入userManager的setter方法,即便不加@Autowired也不会有NPE,功能运转正常,但是理论上置于field上的@Autowired已经无需setter了,而且如果要加入setter的话,就破坏了AOP无代码侵入性的优点,这样的解决方案并不可取。
继续hacking source,发现了Struts2的一个特殊的constant,作用是确保Spring的自动装配策略总是被考虑的,struts.objectFactory.spring.autoWire.alwaysRespect,将其值设为true,OK了,没有setter,自动注入也毫无问题,算是完美解决!
struts.xml这个隐藏得很深的参数:
SpringObjectFactory的关键代码:
之前使用SSH三大经典框架的时候,写了一个简单的统计Action每个方法执行时间的功能类,代码如下:
在applicationcontext.xml加入以下配置:
就可以正确地以AOP的方式完成原本比较繁琐的功能了。
最近把框架升级到SS2H,顺便把Spring AOP实现由原来的Schema方式改为AspectJ方式,代码如下:
struts.xml内容如下:
在applicationcontext.xml加入以下配置:
理论上讲,AOP的功能应该可以正确实现了,实际则不然,以UserAction举例说明,
测试的结果是,userManager注入失败,在执行list()方法的时候报错,NullPointer!
接下来反复Debug后,发现个很奇怪的现象,在AOP执行的RunTimeHandler内部,Debug视图中methodInvocation的proxy的userManager属性是正确地注入的,而其target中的userManager却为null,当跳转到list()时,userManager亦为null,这是怎么回事呢?!
变换了几种测试方法,发现如果是对service层的EntityManager(里面有使用了@Autowired的entityDAO)切面,不会出现NPE,Debug视图中proxy的entityDAO为null而target中的entityDAO正确注入;如果去掉AOP,UserAction运行正常,不会发生userManager注入失败的情况;但是该AOP在Struts1的环境下却执行正确,也没有发生注入失败的问题!
尝试了几种解决方案后,发现如果加入userManager的setter方法,即便不加@Autowired也不会有NPE,功能运转正常,但是理论上置于field上的@Autowired已经无需setter了,而且如果要加入setter的话,就破坏了AOP无代码侵入性的优点,这样的解决方案并不可取。
继续hacking source,发现了Struts2的一个特殊的constant,作用是确保Spring的自动装配策略总是被考虑的,struts.objectFactory.spring.autoWire.alwaysRespect,将其值设为true,OK了,没有setter,自动注入也毫无问题,算是完美解决!
struts.xml这个隐藏得很深的参数:
SpringObjectFactory的关键代码:
0 0
- aop:aspectj-autoproxy 致使autowired失效
- <aop:aspectj-autoproxy />作用
- <aop:aspectj-autoproxy />作用
- <aop:aspectj-autoproxy />作用
- <aop:aspectj-autoproxy/>
- <AOP:aspectj-autoproxy/>
- aop:aspectj-autoproxy
- <aop:aspectj-autoproxy />作用
- <aop:aspectj-autoproxy />的作用
- <aop:aspectj-autoproxy />的作用
- <aop:aspectj-autoproxy /> 的用法
- aop:aspectj-autoproxy 不能生效
- Insight aop:aspectj-autoproxy 解析
- <aop:aspectj-autoproxy/> 的作用
- Spring配置---<aop:aspectj-autoproxy />
- aop:aspectj-autoproxy 标签解析
- spring代理注解<aop:aspectj-autoproxy />
- Spring的<aop:aspectj-autoproxy>配置
- spring中写字符串模板的时候注意不要使用#和$
- 工具类4.0 OkHttp
- 深入理解JavaScript系列:史上最清晰的JavaScript的原型讲解
- qtp10.0下鼠标滚轮事件
- (第十一周项目1)二叉树算法验证(1)层次遍历算法的验证
- aop:aspectj-autoproxy 致使autowired失效
- 第11周项目1-验证算法(1)层次遍历算法的验证
- “让群众合理合法诉求得到合理合法解决”
- 第十一周项目1-验证算法(2)二叉树构造算法的验证
- 8个实现在线浏览PDF文件的实用js插件
- MAT(Memory Analyzer Tool)工具使用
- 【第十一周 项目1-验证算法(1)层次遍历算法的验证】
- Bootstrap<表单>
- java.lang.OutOfMemoryError: PermGen space及其解决方法