﻿<?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-1024-文章分类-containerFramework</title><link>http://www.blogjava.net/produ/category/54581.html</link><description>1GB</description><language>zh-cn</language><lastBuildDate>Mon, 10 Nov 2014 16:17:33 GMT</lastBuildDate><pubDate>Mon, 10 Nov 2014 16:17:33 GMT</pubDate><ttl>60</ttl><item><title>温故知新:spring_10整合Struts</title><link>http://www.blogjava.net/produ/articles/419814.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sun, 09 Nov 2014 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419814.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419814.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419814.html</trackback:ping><description><![CDATA[整合struts，就需要将action的实例交由spring去处理，由此可想，我们需要在项目开始的时候就将action的注入对象加载到spring的工厂里。除了添加struts的依赖，还需要添加struts和spring整合用的插件<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.apache.struts<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>struts2-spring-plugin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>2.3.7<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.apache.struts<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>struts2-core<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>2.3.7<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000ff;">&gt;</span></div>除了在测试类中能取得工厂，通过BeanId在工厂中获取实例的情况，其他时候一般是通过自动扫描并注入，因此，在web.xml中，除了struts的过滤器，还需要额外添加spring上下文的监听器，在项目部署的时候就将action添加到工厂<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">listener</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">listener-class</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.context.ContextLoaderListener<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">listener-class</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">listener</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context-param</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param-name</span><span style="color: #0000FF; ">&gt;</span>contextConfigLocation<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">param-name</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param-value</span><span style="color: #0000FF; ">&gt;</span>classpath*:beans.xml<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">param-value</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">context-param</span><span style="color: #0000FF; ">&gt;</span></div><div>因为需要action被spring进行管理，还需要在struts.xml配置中设置以下内容</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp; &nbsp; &nbsp;<strong><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constant&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="struts.objectFactory"</span></strong><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;value</strong></span><strong><span style="color: #0000FF; ">="org.apache.struts2.spring.StrutsSpringObjectFactory"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span></strong><br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constant&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="struts.devMode"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">package&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="user"</span><span style="color: #FF0000; ">&nbsp;extends</span><span style="color: #0000FF; ">="struts-default"</span><span style="color: #FF0000; ">&nbsp;namespace</span><span style="color: #0000FF; ">="/"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">action&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="*"</span><span style="color: #FF0000; ">&nbsp;<strong>class</strong></span><span style="color: #0000FF; "><strong>="userAction"</strong></span><span style="color: #FF0000; ">&nbsp;method</span><span style="color: #0000FF; ">="{1}"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">result&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="success"</span><span style="color: #0000FF; ">&gt;</span>/user{1}.jsp<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">result</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">action</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">package</span><span style="color: #0000FF; ">&gt;</span></div></div>通过spring进行管理之后，action的class配置就无需再写详细的类目录，直接写作注入类的BeanId<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.action;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.annotation.Resource;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.domain.User;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.service.IuserService;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Scope;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Controller;<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;com.opensymphony.xwork2.ActionSupport;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;com.opensymphony.xwork2.ModelDriven;<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;@Controller("userAction")<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><strong>对于action，需要额外指定Scope为prototype，默认是单例模式</strong></span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span>@Scope("prototype")<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserAction&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ActionSupport&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ModelDriven&lt;User&gt;{<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;serialVersionUID&nbsp;=&nbsp;2698940294947436354L;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;User&nbsp;user;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;User&gt;&nbsp;userList;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Resource<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;IuserService&nbsp;userService;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;list()&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userList&nbsp;=&nbsp;userService.listUser();<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;SUCCESS;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;User&nbsp;getModel()&nbsp;{<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(user&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;User();<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;user;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp; &nbsp; //get/set方法略<br /><span style="color: #008080; ">44</span>&nbsp;<br /><span style="color: #008080; ">45</span>&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;</div><hr />上述配置之后，就完成了对struts的整合，但是整合之后，可能会遇到以下的问题：<br />1：关于声明式事务的切入点表达式。虽然执行对数据库操作的环节是Dao，但是声明却不能在Dao进行事务处理，毕竟一个Dao对数据库的操作不一定能代表一个完整的事务。所以，切入点应该设置在service接口上，一个具体的业务处理应该包含一个完整的事务。拿最经典的银行转账的例子来说，一个账户的金额转出操作和另一个账户的转入操作应该设定在一个service的方法里，当事务对这个方法生效，那么不论转入或者转出任何一个操作出现异常，那么整个操作都会回滚。倘若事务设定在Dao上，那么转入和转出分别为两个方法，其中一个出现异常之后（一般也就是转出出现异常），会出现打钱收不到，钱都不知道去哪儿了的情况，这是我们最不想看到的。可能你会说，把转入和转出设定在Dao的一个方法中不就可以了，对，这样的话是可以解决问题，但是这样会导致层和层之间的分工不明确，相互渗透的情况，Dao只是对数据库的访问，他不应该涉及过分的业务逻辑，就像控制层应该把更多的精力放在跳转或者参数传递上，而不应该和专门控制业务处理的service层抢活干。还有就是在Dao一个方法里进行业务逻辑操作可能会涉及Dao之间的嵌套调用，会出现问题。<br />2：在页面上使用查询时。可能会出现以下的异常<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.LazyInitializationException:&nbsp;could&nbsp;not&nbsp;initialize&nbsp;proxy&nbsp;-&nbsp;no&nbsp;Session<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.duyt.domain.Address_$$_javassist_0.toString(Address_$$_javassist_0.java)<br /><span style="color: #008080; ">6</span>&nbsp; &nbsp; &nbsp;...</div>这是由于hibernate的懒加载机制引起的，由于声明式事务将事务设定在service的接口，导致service方法执行完毕就会关闭session，那么到了页面上需要取得懒加载才能取得的信息时，会导致出现没有session的状态，那么如何解决呢。可以通过一个过滤器，使用Threadlocal在请求之初就开启session，这样，整个流程都可以取得session，请求结束之时再关闭session。新增一个过滤器，将spring工厂中的sessionfactory取得，通过该工厂新建session<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.filter;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.servlet.Filter;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.servlet.FilterChain;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.servlet.FilterConfig;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.servlet.ServletException;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.servlet.ServletRequest;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.servlet.ServletResponse;<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.hibernate.Session;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.hibernate.SessionFactory;<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.context.WebApplicationContext;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.context.support.WebApplicationContextUtils;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;OpenSessionInViewFilter&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Filter{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">spring工厂</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;WebApplicationContext&nbsp;wac;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">hibernateSessionFactory</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;SessionFactory&nbsp;sessionFactory;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">线程间共享的session</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;ThreadLocal&lt;Session&gt;&nbsp;sessionholder&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadLocal&lt;Session&gt;();<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setSession(Session&nbsp;session){<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionholder.set(session);<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Session&nbsp;getSession(){<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;sessionholder.get();<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;removeSession(){<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionholder.remove();<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;destroy()&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;doFilter(ServletRequest&nbsp;req,&nbsp;ServletResponse&nbsp;resp,<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;ServletException&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">执行操作之前先设定session</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(sessionFactory&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSession(sessionFactory.openSession());<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(req,&nbsp;resp);<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">finally</span>{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">操作完毕之后在移除session</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeSession();<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init(FilterConfig&nbsp;cfg)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;ServletException&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">将spring的工厂加载到属性<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这里不要使用new&nbsp;classpathXml..&nbsp;去新建工厂，应该使用项目启动时创建的工厂<br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如下获取</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wac&nbsp;=&nbsp;WebApplicationContextUtils.getWebApplicationContext(cfg.getServletContext());<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionFactory&nbsp;=&nbsp;(SessionFactory)&nbsp;wac.getBean("sessionFactory");<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">63</span>&nbsp;<br /><span style="color: #008080; ">64</span>&nbsp;}<br /><span style="color: #008080; ">65</span>&nbsp;</div>之后，在Dao中进行数据库操作时就需要使用过滤器创建的session<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenSessionInViewFilter.getSession().XXX</div>spring本身也提供了一个叫OpenSessionInViewFilter的过滤器，能帮助我们解决懒加载时没有session的问题，看下web.xml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;实现openSessionInView&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;注意，本过滤器要放在struts过滤器的前面，否则会失效&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter-name</span><span style="color: #0000FF; ">&gt;</span>OpenSessionInViewFilter<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter-name</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;这是自定义的filter&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&lt;filter-class&gt;org.duyt.filter.OpenSessionInViewFilter&lt;/filter-class&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;这是spring提供的&nbsp;OpenSessionInViewFilter，使用spring自带的就不用再DAO的实现中使用filter获取session</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter-class</span><span style="color: #0000FF; ">&gt;</span>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter-class</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter-mapping</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter-name</span><span style="color: #0000FF; ">&gt;</span>OpenSessionInViewFilter<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter-name</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">url-pattern</span><span style="color: #0000FF; ">&gt;</span>/*<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">url-pattern</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter-mapping</span><span style="color: #0000FF; ">&gt;</span></div><img src ="http://www.blogjava.net/produ/aggbug/419814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-09 09:38 <a href="http://www.blogjava.net/produ/articles/419814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_09整合Hibernate</title><link>http://www.blogjava.net/produ/articles/419805.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sat, 08 Nov 2014 16:37:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419805.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419805.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419805.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 整合Hibernate和JDBC有些类似的地方，spring依旧是处理了hibernate的公共打开关闭session等操作，但是详尽内容还是需要参阅文档http://docs.spring.io/spring-framework/docs/，这里先记载一个和Hibernate3整合的常用案例。spring整合hibernate3和hibernate4，这两个版本有一些差异。首先，整合spring...&nbsp;&nbsp;<a href='http://www.blogjava.net/produ/articles/419805.html'>阅读全文</a><img src ="http://www.blogjava.net/produ/aggbug/419805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-09 00:37 <a href="http://www.blogjava.net/produ/articles/419805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_08整合JDBC</title><link>http://www.blogjava.net/produ/articles/419683.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Fri, 07 Nov 2014 13:44:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419683.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419683.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419683.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: spring整合JDBC的详细内容需要参阅github上的spring相关文档，传送门：http://docs.spring.io/spring-framework/docs/，这里记录一个spring和JDBC整合的常用案例搭建测试环境前，首先添加相关的maven依赖Code highlighting produced by Actipro CodeHighlighter (freeware)h...&nbsp;&nbsp;<a href='http://www.blogjava.net/produ/articles/419683.html'>阅读全文</a><img src ="http://www.blogjava.net/produ/aggbug/419683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-07 21:44 <a href="http://www.blogjava.net/produ/articles/419683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_07基于XML配置AOP</title><link>http://www.blogjava.net/produ/articles/419555.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Wed, 05 Nov 2014 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419555.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419555.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419555.html</trackback:ping><description><![CDATA[相比较于使用annotation去配置，使用XML去配置AOP反而简单些，无需在切面类中为每个通知方法定义切入点表达式，切面类简洁且不受代码入侵，非常的灵活。<br /><hr />切面类，去除掉和AOP有关的注解，变得非常简洁<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.autoProxy;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.JoinPoint;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.ProceedingJoinPoint;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.util.Logger;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Component;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;@Component("loggerAspect")<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LoggerAspect&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;loggerBefore(JoinPoint&nbsp;jp)&nbsp;{<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("前置切入点：execute==&gt;"&nbsp;+&nbsp;jp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;jp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;loggerAfter(JoinPoint&nbsp;jp)&nbsp;{<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("后置切入点：execute==&gt;"&nbsp;+&nbsp;jp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;jp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;loggerAround(ProceedingJoinPoint&nbsp;pjp)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Throwable&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("环绕开始切入点：execute==&gt;"&nbsp;+&nbsp;pjp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;pjp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pjp.proceed();<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("环绕结束切入点：execute==&gt;"&nbsp;+&nbsp;pjp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;pjp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">25</span>&nbsp;}<br /><span style="color: #008080; ">26</span>&nbsp;</div>beans.xml变更为以下的配置<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; ">&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/aop"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;开启注解&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:annotation-config&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;指定哪些需要加入扫描&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:component-scan&nbsp;</span><span style="color: #FF0000; ">base-package</span><span style="color: #0000FF; ">="org.duyt.*"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;开启AOP切面自动代理&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;无须再开启&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&lt;aop:aspectj-autoproxy&nbsp;/&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;使用xml配置AOP实现&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aop:config</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;定义切面类并引用&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aop:aspect&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="loggerAspect"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="loggerAspect"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;定义切入点&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aop:pointcut&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="loggerPointcut"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression</span><span style="color: #0000FF; ">="execution&nbsp;(*&nbsp;org.duyt.dao.*.add*(..))||<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execution&nbsp;(*&nbsp;org.duyt.dao.*.delete*(..))||<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execution&nbsp;(*&nbsp;org.duyt.dao.*.update*(..))"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;定义通知，前置&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aop:before&nbsp;</span><span style="color: #FF0000; ">method</span><span style="color: #0000FF; ">="loggerBefore"</span><span style="color: #FF0000; ">&nbsp;pointcut-ref</span><span style="color: #0000FF; ">="loggerPointcut"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;后置&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aop:after&nbsp;</span><span style="color: #FF0000; ">method</span><span style="color: #0000FF; ">="loggerAfter"</span><span style="color: #FF0000; ">&nbsp;pointcut-ref</span><span style="color: #0000FF; ">="loggerPointcut"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;环绕&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aop:around&nbsp;</span><span style="color: #FF0000; ">method</span><span style="color: #0000FF; ">="loggerAround"</span><span style="color: #FF0000; ">&nbsp;pointcut-ref</span><span style="color: #0000FF; ">="loggerPointcut"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">aop:aspect</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">aop:config</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">38</span>&nbsp;<br /><span style="color: #008080; ">39</span>&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div>测试类<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.test;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.action.UserAction;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.BeanFactory;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IocTest&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClassPathXmlApplicationContext("beans.xml");<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;test(){<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">基于XML的AOP</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserAction&nbsp;ua&nbsp;=&nbsp;(UserAction)&nbsp;factory.getBean("userAction");<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ua.addUser();<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;}<br /><span style="color: #008080; ">20</span>&nbsp;</div>结果和使用annotation无异：<br /><div>前置切入点：execute==&gt;org.duyt.dao.impl.UserDao@af08a49==&gt;add method</div><div>环绕开始切入点：execute==&gt;org.duyt.dao.impl.UserDao@af08a49==&gt;add method</div><div>用户增加方法</div><div>后置切入点：execute==&gt;org.duyt.dao.impl.UserDao@af08a49==&gt;add method</div><div>环绕结束切入点：execute==&gt;org.duyt.dao.impl.UserDao@af08a49==&gt;add method</div><img src ="http://www.blogjava.net/produ/aggbug/419555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-05 22:45 <a href="http://www.blogjava.net/produ/articles/419555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_06基于annotation配置AOP</title><link>http://www.blogjava.net/produ/articles/419519.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Wed, 05 Nov 2014 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419519.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419519.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419519.html</trackback:ping><description><![CDATA[要使用注解去配置AOP，首先要在spring的配置中开启切面自动代理。<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; ">&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/aop"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;开启注解&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:annotation-config&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;指定哪些需要加入扫描&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:component-scan&nbsp;</span><span style="color: #FF0000; ">base-package</span><span style="color: #0000FF; ">="org.duyt.*"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;开启AOP切面自动代理&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aop:aspectj-autoproxy&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000ff;">&gt;</span></div>此时，需要加入aop对应的命名空间，虽然搜索一下会有一大堆，但是这种命名空间的声明会在spring-XXX相应的包下找到，要加入aop的声明，可在spring-aop-X.X.X.jar包，META-INF下的spring.schemas，spring.tooling配置文件中找到。<br />在定义切面之前，还是先理清一些概念<br />1，切入点（point-cut），核心是切入点表达式，可以确定请求流程中的某一个点。<br />2，通知（advice），可以理解为在切入点的某个位置（常见如切入点之前，之后，或者环绕着切入点）添加需要拓展的功能，通知包含切入的具体位置和拓展的内容。<br />3，切面（aspect），一类切入点（比如专门添加日志的切面，或者专门记录异常的切面）可以理解为组成了一个切面，切面包含了切入点和所需要的通知。<br />下面定义一个切面：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.autoProxy;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.JoinPoint;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.ProceedingJoinPoint;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.annotation.After;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.annotation.Around;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.annotation.Aspect;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.annotation.Before;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.util.Logger;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Component;<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Spring使用了第三方AspectJ来实现AOP功能，AOP相关的注解需要添加AspectJ的饮用<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Administrator<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">注明这是一个切面类</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; "></span>@Aspect<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">添加spring的管理</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span>@Component("loggerAspect")<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LoggerAspect&nbsp;{<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">@Before标注的方法意为将该方法作用于切入点表达式注明的方法之前执行，可以理解为创建一个通知，<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">关于切入点表达式：execution(*&nbsp;org.duyt.dao.*.add*(..)<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">第一个*代表着任意类型返回值的方法<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">之后跟空格，添加一个包的路径，第二个*表示该包路径下的所有类<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">之后添加&#8220;.&#8221;，再跟需要切入的方法，此处指定了所有以add,delete,update开头的方法，使用&#8220;||&#8221;并列连接这些表达式<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">最后的&#8220;(..)&#8221;表示任意个数的参数列表</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;@Before("execution(*&nbsp;org.duyt.dao.*.add*(..))||"<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"execution(*&nbsp;org.duyt.dao.*.delete*(..))||"<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"execution(*&nbsp;org.duyt.dao.*.update*(..))")<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;loggerBefore(JoinPoint&nbsp;jp)&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;System.out.println(jp.getTarget());</span><span style="color: #008000; ">//</span><span style="color: #008000; ">org.duyt.dao.impl.UserDao@71eecfa7，获取执行的对象<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;System.out.println(jp.getSignature().getName());</span><span style="color: #008000; ">//</span><span style="color: #008000; ">add，获取方法签名</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("前置切入点：execute==&gt;"&nbsp;+&nbsp;jp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;jp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@After("execution(*&nbsp;org.duyt.dao.*.add*(..))||"<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"execution(*&nbsp;org.duyt.dao.*.delete*(..))||"<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"execution(*&nbsp;org.duyt.dao.*.update*(..))")<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;loggerAfter(JoinPoint&nbsp;jp)&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("后置切入点：execute==&gt;"&nbsp;+&nbsp;jp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;jp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Around("execution(*&nbsp;org.duyt.dao.*.add*(..))||"<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"execution(*&nbsp;org.duyt.dao.*.delete*(..))||"<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"execution(*&nbsp;org.duyt.dao.*.update*(..))")<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;loggerAround(ProceedingJoinPoint&nbsp;pjp)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Throwable&nbsp;{<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("环绕开始切入点：execute==&gt;"&nbsp;+&nbsp;pjp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;pjp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pjp.proceed();<span style="color: #008000; ">//</span><span style="color: #008000; ">执行方法</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.info("环绕结束切入点：execute==&gt;"&nbsp;+&nbsp;pjp.getTarget()&nbsp;+&nbsp;"==&gt;"<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;pjp.getSignature().getName()&nbsp;+&nbsp;"&nbsp;method");<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;</div>DAO和Service内容略，测试类如下<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.test;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.action.UserAction;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.BeanFactory;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IocTest&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClassPathXmlApplicationContext("beans.xml");<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;test(){<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">基于annotation的AOP</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserAction&nbsp;ua&nbsp;=&nbsp;(UserAction)&nbsp;factory.getBean("userAction");<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ua.addUser();<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;}<br /><span style="color: #008080; ">20</span>&nbsp;</div>结果：<br /><div>前置切入点：execute==&gt;org.duyt.dao.impl.UserDao@6fc8ddb5==&gt;add method</div><div>环绕开始切入点：execute==&gt;org.duyt.dao.impl.UserDao@6fc8ddb5==&gt;add method</div><div>用户增加方法</div><div>后置切入点：execute==&gt;org.duyt.dao.impl.UserDao@6fc8ddb5==&gt;add method</div><div>环绕结束切入点：execute==&gt;org.duyt.dao.impl.UserDao@6fc8ddb5==&gt;add method</div><img src ="http://www.blogjava.net/produ/aggbug/419519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-05 11:09 <a href="http://www.blogjava.net/produ/articles/419519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_05动态代理实现AOP</title><link>http://www.blogjava.net/produ/articles/419509.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Tue, 04 Nov 2014 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419509.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419509.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419509.html</trackback:ping><description><![CDATA[使用动态代理实现AOP，就无需像静态代理那样一对一的去创建代理类，而是创建一个通用的代理类去接收并创建需要代理的对象，并在代理对象中拓展被代理对象的功能。就比如，我们需要拓展DAO所有实现类的功能，在每个实现类的每个方法中都添加记录日志的功能。<br /><hr /><div>IUserDao&nbsp;</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao;<br /><span style="color: #008080; ">2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.annotation.LogMsg;<br /><span style="color: #008080; ">3</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add();<br /><span style="color: #008080; ">5</span>&nbsp;}</div>UserDao<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao.impl;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.dao.IUserDao;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Scope;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Repository;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;@Repository("userDao")<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;@Scope("singleton")<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserDao&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add()&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用户增加方法");<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">11</span>&nbsp;}</div>创建代理类，这个代理类的主要作用就是为传入的被代理对象，添加方法执行前的记录日志功能<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao.proxy;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.lang.reflect.InvocationHandler;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.lang.reflect.Method;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.lang.reflect.Proxy;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DaoLoggerProxy&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;InvocationHandler&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">使用属性保存，要代理的目标对象</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Object&nbsp;target;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">私有空构造</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;DaoLoggerProxy(){<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">工厂方法</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Object&nbsp;getInstance(Object&nbsp;o){<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DaoLoggerProxy&nbsp;proxy&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DaoLoggerProxy();<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">保存要代理的对象</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.target&nbsp;=&nbsp;o;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">创建传入对象的代理对象</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;=&nbsp;Proxy.newProxyInstance(o.getClass().getClassLoader(),&nbsp;o.getClass().getInterfaces(),&nbsp;proxy);<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">返回创建的代理对象</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">26</span>&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">被代理对象在调用任何方法的时候，都会先调用代理类的invoke方法，那么在此，就可以在被代理对象方法执行的任意一个流程添加需要的功能</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Throwable&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">if&nbsp;(method.isAnnotationPresent(XXX.class))&nbsp;{<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以自定义注解给特定方法，规定这些方法执行哪些特殊的操作<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">if&nbsp;(method.getName().startsWith("add"))&nbsp;{<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对某些约定了方法名的方法拓展需要的功能<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">try&nbsp;{<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;=&nbsp;method.invoke(target,&nbsp;args);<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;记录异常的操作，或者回滚操作<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">在被代理对象方法执行之前进行某些操作</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("----&gt;模拟记录日志&lt;----");<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;=&nbsp;method.invoke(target,&nbsp;args);<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">之后进行某些操作</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;obj;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;</div>beans.xml需要作出如下配置<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;开启注解&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:annotation-config</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;指定哪些需要加入扫描&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:component-scan&nbsp;</span><span style="color: #FF0000; ">base-package</span><span style="color: #0000FF; ">="org.duyt.*"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;限定了私有构造方法，所以不能直接创建代理类，需要传入被代理对象，使用工厂方法返回代理对象，因此需要指定工厂方法，并且该方法在class属性指向的类中要为静态方法&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="daoLoggerProxy"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.duyt.dao.proxy.DaoLoggerProxy"</span><span style="color: #FF0000; ">&nbsp;factory-method</span><span style="color: #0000FF; ">="getInstance"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;通过构造器参数来传入被代理的对象&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">="userDao"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div>配置完毕之后，使用代理注入userDao，@Resource(name = "daoLoggerProxy")，测试<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.test;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.action.UserAction;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.BeanFactory;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IocTest&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClassPathXmlApplicationContext("beans.xml");<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;test(){<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试代理类拓展的功能</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserAction&nbsp;ua&nbsp;=&nbsp;(UserAction)&nbsp;factory.getBean("userAction");<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ua.addUser();<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;}<br /><span style="color: #008080; ">20</span>&nbsp;</div>结果：<br /><div>----&gt;模拟记录日志&lt;----</div><div>用户增加方法</div><img src ="http://www.blogjava.net/produ/aggbug/419509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-04 23:24 <a href="http://www.blogjava.net/produ/articles/419509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_04静态代理实现AOP</title><link>http://www.blogjava.net/produ/articles/419488.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Tue, 04 Nov 2014 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419488.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419488.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419488.html</trackback:ping><description><![CDATA[spring的另一个重要特性是AOP（<span style="color: #333333; font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px; background-color: #ffffff;">Aspect Oriented Programming</span>）面向切面的编程，spring的AOP特性使得对于使用了该特性的项目的可维护性，易拓展性和开发难易度等等都有了不同程度的改善。AOP特性能够使得项目中的某些操作，在执行到某一个指定环节的时候，可以额外的去执行开发者指定的操作，这些操作往往都是具有共通性，而且可能和操作本身所包含的业务逻辑没有直接的关系，比如对数据库的访问，涉及变更数据库内容的操作需要精准的记录日志；每当产生异常或者错误信息的时候，也需要记录错误信息；对服务器敏感资源进行访问的时候需要对用户的权限进行校验等。在哪些环节添加处理，做怎样的处理，都可以由开发者自定义，十分灵活，而且在开发业务逻辑和流程的时候大可不必去考虑这些共同性质的处理，让主要精力都投入在业务的实现上，这样一来，开发效率会大大提高。<br /><hr />先从一个静态代理的例子来感受一下这种切入式的编程<br />IUserDao<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao;<br /><span style="color: #008080; ">2</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add();<br /><span style="color: #008080; ">4</span>&nbsp;}</div>UserDao<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao.impl;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.dao.IUserDao;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Scope;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Repository;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;@Repository("userDao")<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;@Scope("singleton")<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserDao&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add()&nbsp;{<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用户增加方法");<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">13</span>&nbsp;}<br /><span style="color: #008080; ">14</span>&nbsp;</div>一个很单纯的接口实现。倘若这就是一个成品了，测试通过没有问题，可以上线使用。一段时间之后，需要加入日志的功能，那么问题来了，挖掘机哪...噢不对，该如何添加呢？<br />或许会马上想到，直接该啊。那么问题又来了，挖...噢不，直接修改的话，代码就需要测试，而且万一需要修改的地方很多呢，岂不是很痛苦，况且直接修改源代码还违背了OCP原则，绝对不推荐。这时候就可以考虑使用代理类来给源代码增加新功能。<br />代理，望文生义，白话就是&#8220;你要做的事儿我不仅能给你做了，而且除此之外我还能多做别的&#8221;，定义一个UserProxyDao<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao.impl;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.annotation.Resource;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.dao.IUserDao;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.util.Logger;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Scope;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Repository;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;@Repository("userProxyDao")<br /><span style="color: #008080; ">11</span>&nbsp;@Scope("singleton")<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserProxyDao&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Resource<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000FF; ">private</span>&nbsp;IUserDao&nbsp;userDao;</strong><br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add()&nbsp;{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>Logger.info("使用代理，为用户增加方法添加日志");</strong><br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userDao.add();<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">22</span>&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;}<br /><span style="color: #008080; ">24</span>&nbsp;</div>在代理中，将需要拓展功能的对象作为代理的属性注入，然后在需要拓展的方法前后追加需要的功能。在此之后，在给service的IuserDao对象注入实例的时候，要使用代理的对象@Resource(name = "userProxyDao")，测试一下<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.test;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.action.UserAction;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.BeanFactory;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IocTest&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClassPathXmlApplicationContext("beans.xml");<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;test(){<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试代理依赖注入</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserAction&nbsp;ua&nbsp;=&nbsp;(UserAction)&nbsp;factory.getBean("userAction");<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ua.addUser();<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;}<br /><span style="color: #008080; ">20</span>&nbsp;</div>结果：<br /><div>使用代理，为用户增加方法添加日志</div><div>用户增加方法</div><hr />由于IOC和AOP的特性，你会发现你要做的更改十分的少，仅仅只是新增了一个代理类，并修改了注入的对象。虽然静态的代理可以实现我们的需求，但是毕竟不灵活，一旦修改涉及的方法和类一多，那简直就是纯体力活了，一个类的拓展就需要对应一个代理类，一个代理类中还需要涵盖所有需要拓展的方法，并且保证原有功能不受影响，如此一来，功能拓展这一举动就需要投入极大的成本，入不敷出。<img src ="http://www.blogjava.net/produ/aggbug/419488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-04 14:57 <a href="http://www.blogjava.net/produ/articles/419488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_03基于annotation配置IOC</title><link>http://www.blogjava.net/produ/articles/419477.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Tue, 04 Nov 2014 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419477.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419477.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419477.html</trackback:ping><description><![CDATA[相比较使用XML配置，基于annotation的IOC配置会极大的简化配置文件的内容，所以在beans.xml中无需再配置bean的设置，只需要开启组件扫描即可。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;开启注解&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:annotation-config</span><span style="color: #0000FF; ">/&gt;</span></strong><br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;指定哪些需要加入扫描&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:component-scan&nbsp;</span><span style="color: #FF0000; ">base-package</span><span style="color: #0000FF; ">="org.duyt.*"</span><span style="color: #0000FF; ">/&gt;</span></strong><br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div>拿出一个Dao组件的注入为例<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao;<br /><span style="color: #008080; ">2</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add();<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;delete();<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;update();<br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;load();<br /><span style="color: #008080; ">7</span>&nbsp;}</div>Dao的实现<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao.impl;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.dao.IUserDao;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Scope;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Repository;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">使用Repository("userDao")标注UserDao类相当于在配置文件中写作<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&lt;bean&nbsp;id="userDao"&nbsp;class="org.duyt.dao.impl.UserDao"/&gt;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><strong>@Repository("userDao")</strong><br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">相应的，Scope("singleton")标注就相当于的配置scope="singleton"</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><strong>@Scope("singleton")</strong><br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserDao&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add()&nbsp;{<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用户增加方法");<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;delete()&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用户删除方法");<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;update()&nbsp;{<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用户更新方法");<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;load()&nbsp;{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用户查询方法");<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">25</span>&nbsp;}<br /><span style="color: #008080; ">26</span>&nbsp;</div>spring提供了三种注解来对应MVC的三层，数据层的注解对应Repository，业务层对应service，表示层对应controller。还有一个公共的component，分开这么多是为了更好的标注当前这个待注入类的功能，如果不按照这些分类好的注解去注入也可以完成注入，但是还是规范的去写。关于对象中某个属性的注入看下面的action<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.action;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.annotation.Resource;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.domain.User;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.service.IUserService;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Scope;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Controller;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<strong>@Controller("userAction")</strong><br /><span style="color: #008080; ">11</span>&nbsp;<strong>@Scope("prototype")</strong><br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserAction&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>@Resource</strong><br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;IUserService&nbsp;userService;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;testString;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;User&nbsp;user;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;UserAction()&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;UserAction(String&nbsp;testString)&nbsp;{<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>();<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.testString&nbsp;=&nbsp;testString;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;addUser(){<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userService.add();<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000;">get/set略</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #008000; "></span>}<br /><span style="color: #008080; ">31</span>&nbsp;</div>对于某个要注入的属性，Spring自带的注解是@AutoWire，但是这种是按照类型注入的，为了避免接口多实现可能出现的问题，推荐可以使用javax.annotation提供的@resource，这种是按照属性的名称进行注入，可以直接在属性名之上添加注解，这样的话连属性的get/set都可以省了...或者是添加对应的get/set，在set方法上添加注解。但是要注意的是，按照属性名字进行注入，属性的名称需要和注解定义组件时的id一致。Action中的Iuserservice的实例名为userService，会寻找有@service("userService")的注解进行注入，否则会注入失败。<br />测试如下<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.test;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.action.UserAction;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.BeanFactory;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IocTest&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClassPathXmlApplicationContext("beans.xml");<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;test(){<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试依赖注入</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserAction&nbsp;ua&nbsp;=&nbsp;(UserAction)&nbsp;factory.getBean("userAction");<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserAction&nbsp;ua2&nbsp;=&nbsp;(UserAction)&nbsp;factory.getBean("userAction");<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ua&nbsp;==&nbsp;ua2);<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ua.addUser();<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">17</span>&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;</div>结果为：<br /><div>false</div><div>用户增加方法</div><img src ="http://www.blogjava.net/produ/aggbug/419477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-04 11:17 <a href="http://www.blogjava.net/produ/articles/419477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_02基于XML配置IOC</title><link>http://www.blogjava.net/produ/articles/419462.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Mon, 03 Nov 2014 14:46:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419462.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419462.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419462.html</trackback:ping><description><![CDATA[<div>第一个案例已经是基于XML配置spring的工厂了，那么现在，正了八景的配置一下。<br /><hr /></div><div>MVC 的三层式结构已经深入人心了，但是在此不得不稍微吐槽一下，虽然层次清晰，但是还是有不少开发者，甚至一些站点，将这些层次混淆，在本来单单是界面层的页 面中，或者是控制器中嵌入了大量的业务代码，而业务层和数据层却干干净净，就是定义了单纯接口加对应实现。更有甚者在DAO中取request...你要这么写还分毛线层啊...线层啊...层啊！咳咳...言归正传，定义好演示用的数据层和业务层的接口和实现类</div><div>DaoInterface<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao;<br /><span style="color: #008080; ">2</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add();<br /><span style="color: #008080; ">4</span>&nbsp;}</div>DaoImpl<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.dao.impl;<br /><span style="color: #008080; ">2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.dao.IUserDao;<br /><span style="color: #008080; ">3</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserDao&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;IUserDao&nbsp;{<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add()&nbsp;{<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用户增加方法");<br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">7</span>&nbsp;}</div>ServiceInterface<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.service;<br /><span style="color: #008080; ">2</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IUserService&nbsp;{<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add();<br /><span style="color: #008080; ">4</span>&nbsp;}<br /><span style="color: #008080; ">5</span>&nbsp;</div>ServiceImpl<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.service.impl;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.dao.IUserDao;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.service.IUserService;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserService&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;IUserService&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;IUserDao&nbsp;userDao;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add()&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userDao.add();<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IUserDao&nbsp;getUserDao()&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;userDao;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setUserDao(IUserDao&nbsp;userDao)&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.userDao&nbsp;=&nbsp;userDao;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;}</div>实体类<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.domain;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;User&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;id;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Map&lt;Object,&nbsp;Object&gt;&nbsp;mapTest;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;Object&gt;&nbsp;listTest;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;User()&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;User(<span style="color: #0000FF; ">int</span>&nbsp;id,&nbsp;String&nbsp;name)&nbsp;{<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.id&nbsp;=&nbsp;id;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.name&nbsp;=&nbsp;name;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080;">15 &nbsp; &nbsp; //get/set略</span><br /><span style="color: #008080; ">15</span>&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;</div>Action<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.action;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.domain.User;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.service.IUserService;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserAction&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;IUserService&nbsp;userService;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;testStringA;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;testStringB;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;User&nbsp;user;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;UserAction(String&nbsp;testStringA,String&nbsp;testStringB)&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.testStringA&nbsp;=&nbsp;testStringA;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.testStringB&nbsp;=&nbsp;testStringB;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;UserAction()&nbsp;{<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">get/set略</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span>}<br /><span style="color: #008080; ">17</span>&nbsp;</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.action;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.service.IUserService;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AutowiredAction&nbsp;{<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;IUserService&nbsp;userService;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add(){<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userService.add();<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp; &nbsp; &nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">get/set略</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span>}<br /><span style="color: #008080; ">10</span>&nbsp;</div>重点是beans.xml的配置<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans&nbsp;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;default-autowire="byName"&nbsp;此处可以设置全局的自动注入，开启之后所有bean内的属性都会自动按名称注入</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;scope表示一个对象的有效范围，singleton表示单例，prototype表示原型，也就是多例，每次都会获取一个新的实例。&nbsp;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;单例和原型是最常用的方式，spring还提供了以request和session为使用范围的控制，是否使用见仁见智。</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;有效范围的选择需要根据bean的用途来决定，比如Action实例就需要选择prototype，如果使用单例去获取Action实例<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;那么Action的属性可能会影响前后的请求，对象实例的状态会影响其本身的功能，那么就需要使用原型去获取对象的实例；而service<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;和Dao的实例就无须担心，直接使用单例获取实例即可，不会因为自身的属性状态而影响功能的实现，因为他们本身不存在状态。默认情况下<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;会使用单例进行对象实例的创建。&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="userAction"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.duyt.action.UserAction"</span><span style="color: #FF0000; ">&nbsp;scope</span><span style="color: #0000FF; ">="prototype"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;property是指定要注入的属性，通过属性的set方法进行注入，ref则是对bean的引用</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="userService"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="userService"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="user"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="user"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;通过构造方法进行属性的注入，前提是要有只含有下述两个参数的构造方法，还要有空构造&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="testStringA"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="测试用字符串AAA"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="testStringB"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="测试用字符串BBB"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;一般属性的注入和集合对象属性的注入</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="user"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.duyt.domain.User"</span><span style="color: #FF0000; ">&nbsp;scope</span><span style="color: #0000FF; ">="prototype"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="id"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="1"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="name"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="duyt"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;注入map&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="mapTest"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">map</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">entry&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="nihao"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">entry&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="2"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="hello"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">map</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;注入list&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="listTest"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span>1<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span>2<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span>3<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;此处设置了autowire&nbsp;=&nbsp;byName属性，会根据成员变量的名称自动搜索对应的bean并注入,这是推荐的方式，因为bean的名字是不应该重复的，<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;只要属性的名称能够匹配到bean的id，并且属性含有get/set，那么就会成功注入。还有一种方式是按照类型注入byType，按照类型注入可能会存在一个接口<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;有多个实现类的情况，比如action的XXXservice接口有多个实现类，那么注入的时候会产生异常&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="autowiredAction"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.duyt.action.AutowiredAction"</span><span style="color: #FF0000; ">&nbsp;scope</span><span style="color: #0000FF; ">="prototype"</span><span style="color: #FF0000; ">&nbsp;autowire</span><span style="color: #0000FF; ">="byName"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="userDao"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.duyt.dao.impl.UserDao"</span><span style="color: #FF0000; ">&nbsp;scope</span><span style="color: #0000FF; ">="singleton"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="userService"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.duyt.service.impl.UserService"</span><span style="color: #FF0000; ">&nbsp;scope</span><span style="color: #0000FF; ">="singleton"</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="userDao"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="userDao"</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #008080; ">55</span>&nbsp;<br /><span style="color: #008080; ">56</span>&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000ff;">&gt;</span></div>最后使用测试类来验证注入的情况<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.duyt.test;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.action.AutowiredAction;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.duyt.action.UserAction;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.BeanFactory;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IocTest&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ClassPathXmlApplicationContext("beans.xml");<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;test(){<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserAction&nbsp;ua&nbsp;=&nbsp;(UserAction)&nbsp;factory.getBean("userAction");<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试使用构造方法进行注入</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ua.getTestStringA());<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ua.getTestStringB());<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">属性注入</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ua.getUser().getId());<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ua.getUser().getName());<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">集合注入</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ua.getUser().getListTest().size());<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ua.getUser().getMapTest().get("1"));<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">根据属性名自动注入</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AutowiredAction&nbsp;aa&nbsp;=&nbsp;(AutowiredAction)&nbsp;factory.getBean("autowiredAction");<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa.add();<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;}<br /><span style="color: #008080; ">31</span>&nbsp;</div><span style="font-size: 13px; background-color: #eeeeee;">&nbsp;&nbsp;</span></div><img src ="http://www.blogjava.net/produ/aggbug/419462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-03 22:46 <a href="http://www.blogjava.net/produ/articles/419462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>温故知新:spring_01IOC整体感受</title><link>http://www.blogjava.net/produ/articles/419452.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Mon, 03 Nov 2014 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/419452.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/419452.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/419452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/419452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/419452.html</trackback:ping><description><![CDATA[IOC（inverse of control）控制反转，是spring提供的非常优秀的一种特性，这种特性使得在项目中，所有对象的实例都交由spring去创建，管理。为什么要这么做呢，假使我们脱离spring，在开发的过程中，需要新建实例的时候自己去new，那么组件之间的耦合度会非常高，在一个业务处理类中，某个对象就写死引用某个实例，一旦有较大的业务变更，需要修改的地方可能会多的不敢想象，如果文档，代码和注释的维护较差，那么业务变更简直就是噩梦。spring的IOC特性就助力实现了&#8220;高内聚，低耦合&#8221;的这种设计理念。<br />记录一下平时在使用spring时的一些技巧和心得，先说明一下测试环境。<br /><hr /><div>环境如下<br /><strong>系统：</strong>64位win7<br /><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaIAAACxCAIAAAAJXC65AAAQTUlEQVR4nO2dvXHrvBJA1ZMzluIC0IZbYHoz584ZOXH+xg1wxjNuwC3oBfzBLrAAIZmS6P3OGc+9JkWCPyIOFwDNPZ0AANxzBgBwCpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOegOQBwDpoDAOfcXHPj69vp5et25QMA1Dms5r7C07/T8tO9/ljL/PTPpY8Uw8u/8GGvruf/9M/vg1nE92f39NZ/N3/08X56qhRV+Kh50+Pr2+n5cyysUTrnw8v26WpZ5vzxrrf+FUonR9H6fQHsy66a+/7shJvqP5NfhpfSAg0iqKhE8TN+fHZP/5KaP7z8y0zx0z/nM9dDM2vyT/+cH5oxM25daS5fMj0iy1m5oDdXmQ95D80Ztqpot/wVLz9lXwPswk2jua/w9BZe3k7Pb83xSzUu+HhvdKjSysT3Z/cU1TC+vhUU+dM/Z+ueS5pbKrwW7vj61r3+TFs0lJFpLgorEXd+25iMYNxOpn1TIXD1563/vux8xp2c9n/zlracww1vpoEhwP7cSnOrR5bI4itYdX58fWupY4UVt9V5Tflmo9LS3PASK7MIZ75CwWLZzrz135uaE5OLEdI2eLZv10dzi/gqoaI86haI5uDh7K+56bJeq5OscnM9L1WS1kbouRgoNVDv1apu0Q4zt02abE4d5uWay8MfU3PNNwzBV3h6Dy//upf3rnSK5JmvBINidaI5eDh7am4SXHhpawq9fDWGWlnN2WqaVatNWXOim2wJP1u2sjHGklXj4eXfbzTX58MpWfh5XTQ3fTr9O76+mQFdcg9rgWgOHs4NGq21+3NxrK25KbTIqLDwZrDWtEBr39yy/AXVONozfJyviebO5/PHe72VfU00J1rE3euPbnrLZd7D8g3WDpxoDo7EbTRXrfYX99DFajCPD7Quf0kXu9nKjtQ11xzNja9v3ct79/Q+nL/CMiZ78RDEvG5hrSuiOXF0cRkjDp07E4nm4G/x+GhurgalVURpaw2smGUjWJvE8bBo7qd/fus/LhpptaK5ZH+WtS7rBIjHqKQpVWiF2NdojmgOHstjNbc8p1YPu7LSrtbctGLhaeFq4XtEc/OSSl76AZp2zcnn/uxBCfN2ko/wpCPg2kr54zXiG6x8a8UTYrWFAW7MIxutMViomNH6qLmRq4mqqlW220Vzw8tb/63llRzdqrnpl6rmoiLV/LnvUj3FUhrp/rafmtZ+/ApqmURzxmmUW1y+4mVXv3+G7Emg+l0H4Pc8vtE6r3LraC4JcMoPr8TCvz87ZYTq3zMZR1141DnKKzsbUnPPn+OG5tL5sflffHZ37lybZKduM8Xlzzriu0Rz6r4ST8X8+PQswc/pb1QwHdyOY7yh5IporqK5/KOP91M+9PHxfrI0tDZs1SqlPyxt7wtT3WprV5rWhPwobd4Wz1K91Xzp3xRvPULcrjnZ4NVjJjNi5vdn9/zZvpMAF7Gn5q7tAt8hmpPDebo6TQ9wVP7qPi3fHhLZiuas3vpqNGcXqB83KY60SlT32faw5kbf2aWaay3fvjYYfIC78CejuUamqrXZGtI9VmbcUdbcYiJrK43v7ShTjOaSP/inUx+gxjE0BwBwM9AcADgHzQGAc9AcADgHzQGAc9AcADgHzQGAc9AcADgHzQGAc9AcADgHzQGAc9AcADgHzQGAc9AcADgHzQGAc9AcADgHzQGAc9AcADgHzQGAc+6uubHvTl3fmNxhCO3LXsgQun48D+EUkkQKY9+dTsZmx7671b4AwC3ZU3NDOElpJEKbJw+puUltM6n3ZtAcwB9l12hOWSmNiq5R1h01l8tNuc8C6wH8CXbVnIrUhnAKIbYJrwqGHqo5xey8jaUA4IDs2zc39t1igiGcwhCn19/irCGcur4PWWQ0BDtkkvPjRpbPRYt5mSvCsVxPqrQ+DdwSuY59F/q+6/o+IDqAv8bOQxCrxGKYNBlj7etXmjuJmety0UlDWIUjfhVLycK6Lm6q60epXIspmou7HcI6I43tpn2fD0WtBwB/gL1HWmcZrHpb5bBIKonmRrVa2kpdJ9PW61LK8v8Qun6cDCTNWulAW6O5afXTFK3Nuywst25ZlovpAP4Qe2tubayKxqSa3k1zUj5CcEPSB1h6PmRdZdHckO2q7muUHyRjygBwZHbX3Dz0oBqYcrquOSWQse/KjVahza6L/X5r0/U89v2QbjIy+236b21Rq63Mc3VX4dpzJ3f0fwBwYPbXnOxzM6Y3NCe10vV9qA9BLAUu0/qhvLhCFnkt2xv7Lgzy4bmu6wqBGs/NAfxRbqC5v8AykLCMPfQyjJPijKA5gD/Kf1RzAPDfAc0BgHPQHAA4B80BgHPQHAA4B80BgHPQHAA4B80BgHPQHAA4B80BgHPQHAA4B80BgHPQHAA4B80BgHPQHAA4B80BgHP+lOb0y4E3eGxmmiGoBGWFxBExTVj6KvY1X1lMJispZbgAgJyjaC5JIpMIbZ48hubGNKmrvZ1FTkYuiTWZRJzM8inmmlPbJeEOQDNH0Zy2UhqsXKOs+0RzVjodKbYu9MMQMyKqnBdrNp80+WJRc8gN4AoOozkVqU3ZwE6GHNq5i+ZKOa8Hmds6j+aW1LJ9OIUBzQHclsNoThpjSZg6T6+/JVnB+pC1GXULsZoVTGhQtJiXucJOFbcUVaqSXY+XRHNqBbXbfSpMuuYAmjiO5qLEYvSy5m5NfCeTIsYwUPXviZSrWY7XtatrjZm6uKlZNy29X+WAsdyplllU9s3lmkt67IKMEontAJo4kOZEk23NLjjLYs0wXcvxmkhnnUxltJSy/J83Gpcwqh4u1VxYam1uRHOzvfNobs6LHXpxbrAcQBtH0tzaWBWNSTW9m+akRoXghqQPsPrYRs1ys4TK0dy88T4abtrlrlOFqhhvKi09JwCwxaE0Nw89qAamnK5rTjVax74rN1qFNlevTL+vDuqHdJP5rpZNM5urFs1NM+UBjn0XhvgYyvQATVx/bbrrwwGALY6lOdnnZkxvaE522Xd9H+pDEEuBy7R+KC+uYEqu/gTfbLk5YDvlqMBxMdpJB4BxGem/Sd9dx5NzAM0cTHMuGMI6KhqGLPaaDD0E0ZztuijNIQ4fDyLMC9PjJ0ruqA6gCTQHAM5BcwDgHDQHAM5BcwDgHDQHAM5BcwDgHDQHAM5BcwDgHDQHAM5BcwDgHDQHAM5BcwDgHDQHAM5BcwDgnONorjH18rRAMV+WKjCZNYRT/kJKlW7BERfltN1pe6W38/0Bbny6lvcHGm8eXN/8Kq7jJLdvsmO/v7CbK9GyI/odjX/vSz6o5sqpl8VLdNMXmscUOOLi2EjRZWi1gtqtaq2wN7tevsnb3LOZcXVzK6W3t4vr/b6aa8wRpOrzoSrLbU/X9ObX7NX2cUbuJJnnafcLe6MSmVffsh9o7lds5iRNHDOoRdK3jxsf2AWZWN9jVhEqNWOwXuwulo/3Y3OmkVDR2JcuPbDlJZ0PiE71m+cLFSx5NfTj4+hmOf9+OyqhUjL/HM/F4h+dACXxXbqynLV1YfdtlWgiSyyH5n5NW+plcWWqL8HO/2zdQtUmm69ycf3JG11DCWN81Xn+undzplKbuf9j301XbHbd9/dIwp3ToLmsqfV47qQ5eQWkZJGZvrjkTXe/C3u7EhnTaG4XmlIvr1/1mnlwXVlklZFfoX0FpRuUNzw7wc3sHyGlsdDcyI9LZp+Nc/OuyDhTaS7fpXnmkKS76PpxnaXWkzkyVuPKHh07V4bVLrITexvkHUq1WplvPdlJMZl+TS2r5wcj1hK5OMoFljKgb7K+Jl/mZkpjtgZ2u7C3KpGh45h/Cc39jpbUy2uGv1HkHkwul/xqEImzzmIDhc4tu8HaD6UPJwOWj8rSzjLfnKnSPKQ5gOLea+9mkaBKD5Qc6XQdq1qtk/2sV7sxqmMs2RLNFTVXKjPZST2pG/hNqwdpAX3SKqdLbyjvadhklBnjYqH2OJtJVgt+eWG3VCLjKNHcLmynXh5lhr9lnTAkV00ptpdfz1x8/aYnuFJzKvprj+bkyZhzuWb7E9Mu6gAw15zhF22idAG5pg5cikv+QnPFMpNyCpOtqy+fqS/Z0lztbMgO11bNDf2Uoc0aZhUaUyXKO/52b8xlF3ZbJZrmhiA8i+Z2YTv18tBnYjjnY+nJTS8fsYpbao7mrmm0pn1RZlN0u31q7pHqXFHJGvfRnJwe46huecm2vjnrTBXLvFpz1uoyxomfNGouuYHkp2gDvfTYh647dV0/JMtcGM1deWE3VaL52o3phmm07sTYmHo5vRGlEVjyJcfF06+ndGHZ36HoYZNXX7GRa7RqUjeNxZlqs1Z9knV42iMxZTVa14/7bDTEaKYtJWQ5uQtLNmkua07FSmSWaXhN9r8WG63m6sn+XdRozU2uZVq8ZsSui/6vxVD6/rgdze15YW9UojjuW2u0Nh37QTiK5sY4GlVPvawMKPth1l/1VyMvzfRqaI/mzoa6yj00aR9w3uwwG9lJP5Rc09gXtbRsteTRTLqJ3ERmp7uYa8072RpZtlZqola3Y+Yej5PBTBLeuvp8SkNQcjtdMgSRaG5YHrOt1nVxba93i+X6zr+iDKvr7JcX9kYliosZX+KyubZjPwjzqXz0bpxFR2g99fJ8J7Se+p56stS3adyNxLRuL+b1J0NdjBc0W+DXFIPEh9IezQ06AE9/LTaDY2S144W9UYmsqPIc7S/i5c1jPwhH0RxAlWNqDv4GaA7+BGgOrgfNAYBz0BwAOAfNAYBz0BwAOAfNAYBz0BwAOAfNAYBz0BwAOAfNAYBz0BwAOAfNAYBz0BwAOMej5sovgrvDhvnzcoCjcSjNWa9xvIJfaU69Uu7C3WjTnHiVIQDcgeNoTr7L+4HvJBUvJbxYl5uam96HLF5fCwC35zCauyyLyJ32o5SOqrxui79o2wLclcNoLsuEJeerlzPPmpjSEYXQ6Zepl9/rL9KzJHMkBc2JtmySLEYUlaRQKTVN0RzAXTmO5lZpJC+tVxJb3psvFsuTOZWyNBULlJiNVjOZcV74UqD1ln1jMQC4C0fS3Pl8ThJppCmysqBpXkjPlhmUEtvYBRrbzz9M47lS/tNQiEqTxdAcwL04nObO53MMmey+sVQTa7rcNEWnqbmNzjarj1BmGK0UHjMu1reB5gDuymE0pwZXV4WoDrslh1umibHvuhA63Xd3TlafMjGbBSb7UUsKnSRCttM8Gykvk02gOYD7cRjN6eZitIDR959rQnullom5NJggi8pjMTuZcTXN89Q8TraQJh1GdgB34ECaAwC4BWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOWgOAJyD5gDAOScAAPf8H6Bsgux58XLiAAAAAElFTkSuQmCC" alt="" /><br /><strong><br />测试环境：</strong><br /><img src="data:image/png;base64,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" alt="" /><br /><hr />先从一个helloworld的简单案例开始吧<br />新建一个maven项目，选择<br /><img src="data:image/png;base64,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" alt="" /><br /><br />其实不论使用哪个框架技术，都无非三步走，import，config，run，首先，我们import<br />因为使用maven来管理项目，所以直接添加spring的依赖到pom.xml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.springframework</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">spring-core</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">3.0.5.RELEASE</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.springframework</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">spring-context</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">3.0.5.RELEASE</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div>之后，我们开始config，作为一个基本IOC演示，只需要定义工厂的配置。定义一个beans.xml文件，置于src下。其中bean标签就是定义beanId和待注入对象实例之间的映射。<br />就是&#8220;用这个id取对象实例，你会取到class的对象实例&#8221;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans&nbsp;<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="helloSpring"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="demo.model.Demo"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">8</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div>演示类<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; "> demo.model;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Demo&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Demo()&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hello(){<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span></div>测试类<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;org.duyt.test;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.duyt.model.Demo;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.junit.Test;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.beans.factory.BeanFactory;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SpringDemo&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">读入指定的工厂配置文件到spring的容器，文件名可自定义</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;BeanFactory&nbsp;factory&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">beans.xml</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test(){<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">根据bean的key获取对象的实例</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Demo&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Demo)&nbsp;factory.getBean(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloSpring</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">或者直接使用重载的getBean方法，设定好需要返回的类型<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Demo&nbsp;dd&nbsp;=&nbsp;&nbsp;factory.getBean("helloSpring",&nbsp;Demo.class);</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.hello();<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">dd.hello();</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "></span></div>以上，就是spingIOC最简易的使用。</div><img src ="http://www.blogjava.net/produ/aggbug/419452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2014-11-03 17:19 <a href="http://www.blogjava.net/produ/articles/419452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>