﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-金窝银窝不如自己的WEB窝!-文章分类-SPRING</title><link>http://www.blogjava.net/gkc/category/42151.html</link><description>gkc</description><language>zh-cn</language><lastBuildDate>Fri, 13 Nov 2009 12:54:48 GMT</lastBuildDate><pubDate>Fri, 13 Nov 2009 12:54:48 GMT</pubDate><ttl>60</ttl><item><title>关于SPIRNG注入实现了接口的DAO抛异常的解决方法</title><link>http://www.blogjava.net/gkc/articles/301942.html</link><dc:creator>gkc</dc:creator><author>gkc</author><pubDate>Wed, 11 Nov 2009 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/gkc/articles/301942.html</guid><wfw:comment>http://www.blogjava.net/gkc/comments/301942.html</wfw:comment><comments>http://www.blogjava.net/gkc/articles/301942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gkc/comments/commentRss/301942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gkc/services/trackbacks/301942.html</trackback:ping><description><![CDATA[先看一段代码:<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.test;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_42_45_Open_Image" onclick="this.style.display='none'; Codehighlighter1_42_45_Open_Text.style.display='none'; Codehighlighter1_42_45_Closed_Image.style.display='inline'; Codehighlighter1_42_45_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_42_45_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_42_45_Closed_Text.style.display='none'; Codehighlighter1_42_45_Open_Image.style.display='inline'; Codehighlighter1_42_45_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Movein&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_42_45_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_42_45_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.test;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />@Service(value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">moveManager</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />@Transactional<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img id="Codehighlighter1_106_109_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_109_Open_Text.style.display='none'; Codehighlighter1_106_109_Closed_Image.style.display='inline'; Codehighlighter1_106_109_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_106_109_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_106_109_Closed_Text.style.display='none'; Codehighlighter1_106_109_Open_Image.style.display='inline'; Codehighlighter1_106_109_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MoveManager&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Movein&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_106_109_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_106_109_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<br />
<p>在MoveAction中我们采用两种方式得到MoveManager 的对象：<br />
第一种：用@Autowired注解自动注入<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">@Autowired<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;MoveManager&nbsp;moveManager;</span></div>
<p>第二种：用ApplicationContext中的getBean()</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">ApplicationContext&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*************</span><span style="color: #000000"><br />
MoveManager&nbsp;moveM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(MoveManager)ctx.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">moveManager</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<p>&nbsp;</p>
<p>采用第一种方法，当调用Action时会抛出类似的异常：BeanCreationException: Could not autowire field : private com.test.MoveManager &nbsp;com.test.MoveAction.moveManager <br />
<br />
采用第二种方法，当执行MoveManager moveM = (MoveManager)ctx.getBean("moveManager");时会抛出类似的异常：java.lang.ClassCastException: $Proxy40 cannot be cast to com.test.MoveManager 。把代码改为：Movein moveM = (Movein)ctx.getBean("moveManager"); 后运行正常，但这不是我想要的结果，我并不想改变强制转换类型。</p>
<p>现在来说说为什么会出现这种问题和解决方法。Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。默认情况如果被代理的目标对象实现了至少一个接口，则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。 若该目标对象没有实现任何接口，则创建一个CGLIB代理。这就说明了为什么强制类型是MoveManager时会出现ClassCastException异常而强制类型是Movein时运行正常，因为MoveManager被JDK代理。如果你希望在不改变代码的情况下代理目标对象的所有方法，而不只是实现自接口的方法（强制使用CGLIB代理）只需要将&lt;aop:config&gt;的proxy-target-class 属性设为true:</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:config&nbsp;</span><span style="color: #ff0000">proxy-target-class</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span></div>
<p><br />
或者把Movein改成abstract类。</p>
 <img src ="http://www.blogjava.net/gkc/aggbug/301942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gkc/" target="_blank">gkc</a> 2009-11-11 10:49 <a href="http://www.blogjava.net/gkc/articles/301942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>