<?xml version="1.0" encoding="UTF-8"?>


<rss version="2.0">
	<channel>
	<title>风信Java论坛</title>
	<link>http://www.javawind.net/index.jsp</link>
	<Description>Latest 20 article of this forum</Description>
	<language>zh-cn</language>
	<copyright>Copyright (C) 风信Java论坛</copyright>
	<generator>Rss Generator By JavaWind.Net</generator>
	<image>
		<title>风信Java论坛</title> 
		<url>http://www.javawind.net/images/logos.gif</url> 
		<link>http://www.javawind.net/</link>
	</image>

	
	<item>
		<title><![CDATA[Spring 框架是一个分层架构，由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上]]></title>
		<link>http://www.javawind.net/8a8080a229fa769d012a1be642f006d9.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>&nbsp;<span class="Apple-style-span" style="font-family: verdana, nsimsun, sans-serif; line-height: 19px; ">Spring 框架是一个分层架构，由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上，核心容器定义了创建、配置和管理 bean 的方式，如图所示：</span><br />
<a target="_blank" href="Upload/2010-07/29_0951_9E155FB.gif"><img border="0" onload="reSizeImg(this);" alt="点击在新窗口打开" src="http://www.javawind.net/Upload/2010-07/29_0951_9E155FB.gif" /></a></p>
<p><span class="Apple-style-span" style="font-family: verdana, nsimsun, sans-serif; line-height: 19px; ">
<p style="padding-bottom: 8px; padding-top: 5px; margin-top: 0px; margin-bottom: 0px; ">组成 Spring 框架的每个模块（或组件）都可以单独存在，或者与其他一个或多个模块联合实现。每个模块的功能如下：</p>
<ul style="margin-top: 2px; margin-bottom: 2px; padding-top: 2px; padding-bottom: 2px; ">
    <li><b>核心容器</b>：核心容器提供 Spring 框架的基本功能。核心容器的主要组件是&nbsp;<code>BeanFactory</code>，它是工厂模式的实现。<code>BeanFactory</code>&nbsp;使用控制反转&nbsp;（IOC） 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。</li>
    <li><b>Spring 上下文</b>：Spring 上下文是一个配置文件，向 Spring 框架提供上下文信息。Spring 上下文包括企业服务，例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。</li>
    <li><b>Spring AOP</b>：通过配置管理特性，Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以，可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP，不用依赖 EJB 组件，就可以将声明性事务管理集成到应用程序中。</li>
    <li><b>Spring DAO</b>：JDBC DAO 抽象层提供了有意义的异常层次结构，可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理，并且极大地降低了需要编写的异常代码数量（例如打开和关闭连接）。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。</li>
    <li><b>Spring ORM</b>：Spring 框架插入了若干个 ORM 框架，从而提供了 ORM 的对象关系工具，其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。</li>
    <li><b>Spring Web 模块</b>：Web 上下文模块建立在应用程序上下文模块之上，为基于 Web 的应用程序提供了上下文。所以，Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。</li>
    <li><b>Spring MVC 框架</b>：MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口，MVC 框架变成为高度可配置的，MVC 容纳了大量视图技术，其中包括 JSP、Velocity、Tiles、iText 和 POI。</li>
</ul>
</span></p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-29 09:52:09.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring能做什么？]]></title>
		<link>http://www.javawind.net/8a8080a229d443800129da2a8b930007.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>　　Spring提供许多功能,在此我将快速地依次展示其各个主要方面。</p>
<p>　　首先,让我们明确Spring范围。尽管Spring覆盖了许多方面，但我们已经有清楚的概念，它什么应该涉及和什么不应该涉及。</p>
<p>　　<b>Spring的主要目的是使J2EE易用和促进好编程习惯。 </b></p>
<p>　　Spring不重新开发已有的东西。因此，在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如Commons Logging 用来做所有的日志输出，或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因，我们没有提供O/R mapping层，对此，已有有好的解决办法如Hibernate和JDO。</p>
<p>　　<b>Spring的目标是使已存在的技术更加易用</b>。</p>
<p>　　例如,尽管我们没有底层事务协调处理，但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。</p>
<p>　　Spring没有直接和其他的开源项目竞争，除非我们感到我们能提供新的一些东西。例如，象许多开发人员，我们从来没有为Struts高兴过，并且感到在MVC web framework中还有改进的余地。在某些领域，例如轻量级的IoC容器和AOP框架，Spring有直接的竞争，但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)</p>
<p>　　<b>Spring也得益于内在的一致性。 </b></p>
<p>　　所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些。</p>
<p>　　并且我们已经能够使用一些主要的概念,例如倒置控制，来处理多个领域。</p>
<p>　　<b>Spring在应用服务器之间是可移植的。 </b></p>
<p>　　当然保证可移植性总是一次挑战，但是我们避免任何特定平台或非标准化,并且支持在WebLogic，Tomcat，Resin，JBoss，WebSphere和其他的应用服务器上的用户。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-16 15:31:48.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring框架的好处]]></title>
		<link>http://www.javawind.net/8a8080a229d443800129da2922000006.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>　　在我们进入细节以前，让我们看一下Spring可以给一个工程带来的一些好处:</p>
<p>　　◆Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework，你会发现Spring关注了遗留下的问题。</p>
<p>　　◆Spring能消除在许多工程上对Singleton的过多使用。根据我的经验，这是一个主要的问题，它减少了系统的可测试性和面向对象特性。</p>
<p>　　◆Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中，可通过一种一致的方法来进行配置。曾经感到迷惑，一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗？有了Spring，你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。</p>
<p>　　◆Spring能通过接口而不是类促进好的编程习惯，减少编程代价到几乎为零。</p>
<p>　　◆Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。</p>
<p>　　◆使用Spring构建的应用程序易于单元测试。</p>
<p>　　◆Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口，却不会影响调用代码。</p>
<p>　　◆Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物，它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器，如果你仅仅需要与单个的数据库打交道，甚至不需要JTA实现。</p>
<p>　　■Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品（如Hibernate）。</p>
<p>　　Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。</p>
<p>　　总结起来，Spring有如下优点：</p>
<p>　　◆低侵入式设计，代码污染极低</p>
<p>　　◆ 独立于各种应用服务器，可以真正实现Write Once,Run Anywhere的承诺</p>
<p>　　◆Spring的DI机制降低了业务对象替换的复杂性</p>
<p>　　◆Spring并不完全依赖于Spring，开发者可自由选用Spring框架的部分或全部</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-16 15:30:15.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring带给我们什么]]></title>
		<link>http://www.javawind.net/8a8080a229d443800129da281ab20005.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>　　◆<b>方便解耦，简化开发</b><br />
　　通过Spring提供的IoC容器，我们可以将对象之间的依赖关系交由Spring进行控制，避免硬编码所造成的过度程序耦合。有了Spring，用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码，可以更专注于上层的应用。</p>
<p>　　◆<b>AOP编程的支持</b><br />
　　通过Spring提供的AOP功能，方便进行面向切面的编程，许多不容易用传统OOP实现的功能可以通过AOP轻松应付。</p>
<p>　　◆<b>声明式事务的支持</b><br />
　　在Spring中，我们可以从单调烦闷的事务管理代码中解脱出来，通过声明式方式灵活地进行事务的管理，提高开发效率和质量。</p>
<p>　　◆<b>方便程序的测试</b><br />
　　可以用非容器依赖的编程方式进行几乎所有的测试工作，在Spring里，测试不再是昂贵的操作，而是随手可做的事情。</p>
<p>　　◆<b>方便集成各种优秀框架</b><br />
　　Spring不排斥各种优秀的开源框架，相反，Spring可以降低各种框架的使用难度，Spring提供了对各种优秀框架（如Struts,Hibernate、Hession、Quartz）等的直接支持。</p>
<p>　　◆<b>降低Java EE API的使用难度</b><br />
　　Spring对很多难用的Java EE API（如JDBC，JavaMail，远程调用等）提供了一个薄薄的封装层，通过Spring的简易封装，这些Java EE API的使用难度大为降低。</p>
<p>　　◆<b>Java 源码是经典学习范例</b><br />
　　Spring的源码设计精妙、结构清晰、匠心独用，处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平，学习和研究Spring源码将会使你收到意想不到的效果。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-16 15:29:08.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[为什么需要Spring]]></title>
		<link>http://www.javawind.net/8a8080a229d443800129da26ed0f0004.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>　　你可能正在想&ldquo;Spring不过是另外一个的framework&rdquo;。当已经有许多开放源代码(和专有) J2EE framework时，我们为什么还需要Spring Framework？</p>
<p>　　Spring是独特的,因为若干个原因:</p>
<p>　　◆它定位的领域是许多其他流行的framework没有的。Spring关注提供一种方法管理你的业务对象。</p>
<p>　　◆ Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。因此从你的学习中，你可得到最大的价值。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。</p>
<p>　　◆它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。</p>
<p>　　Spring对你的工程来说，它不需要一个以上的framework。Spring是潜在地一站式解决方案，定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-16 15:27:51.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring简介]]></title>
		<link>http://www.javawind.net/8a8080a229d443800129da2648530003.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>　　Spring是一个开源框架，它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而，Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言，任何Java应用都可以从Spring中受益。</p>
<p>　　◆目的：解决企业应用开发的复杂性</p>
<p>　　◆功能：使用基本的JavaBean代替EJB，并提供了更多的企业应用功能</p>
<p>　　◆范围：任何Java应用</p>
<p>　　简单来说，Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。</p>
<p>　　◆<b>轻量</b>&mdash;&mdash;从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外，Spring是非侵入式的：典型地，Spring应用中的对象不依赖于Spring的特定类。</p>
<p>　　◆<b>控制反转</b>&mdash;&mdash;Spring通过一种称作控制反转（IoC）的技术促进了松耦合。当应用了IoC，一个对象依赖的其它对象会通过被动的方式传递进来，而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反&mdash;&mdash;不是对象从容器中查找依赖，而是容器在对象初始化时不等对象请求就主动将依赖传递给它。</p>
<p>　　◆<b>面向切面</b>&mdash;&mdash;Spring提供了面向切面编程的丰富支持，允许通过分离应用的业务逻辑与系统级服务（例如审计（auditing）和事务（transaction）管理）进行内聚性的开发。应用对象只实现它们应该做的&mdash;&mdash;完成业务逻辑&mdash;&mdash;仅此而已。它们并不负责（甚至是意识）其它的系统级关注点，例如日志或事务支持。</p>
<p>　　◆<b>容器</b>&mdash;&mdash;Spring包含并管理应用对象的配置和生命周期，在这个意义上它是一种容器，你可以配置你的每个bean如何被创建&mdash;&mdash;基于一个可配置原型（prototype），你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例&mdash;&mdash;以及它们是如何相互关联的。然而，Spring不应该被混同于传统的重量级的EJB容器，它们经常是庞大与笨重的，难以使用。</p>
<p>　　◆<b>框架</b>&mdash;&mdash;Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中，应用对象被声明式地组合，典型地是在一个XML文件里。Spring也提供了很多基础功能（事务管理、持久化框架集成等等），将应用逻辑的开发留给了你。</p>
<p>　　所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-16 15:27:08.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring的起源和背景]]></title>
		<link>http://www.javawind.net/8a8080a229d443800129da2281f50002.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>　　Rod Johson在2002年编著的《Expert one to one J2EE design and development》一书中，对Java EE正统框架臃肿、低效、脱离现实的种种现状提出了质疑，并积极寻求探索革新之道。以此书为指导思想，他编写了interface21框架，这是一个力图冲破Java EE传统开发的困境，从实际需求出发，着眼于轻便、灵巧，易于开发、测试和部署的轻量级开发框架。Spring框架即以interface21框架为基础，经过重新设计，并不断丰富其内涵，于2004年3月24日，发布了1.0正式版。同年他又推出了一部堪称经典的力作《Expert one-to-one J2EE Development without EJB》，该书在Java世界掀起了轩然大波，不断改变着Java开发者程序设计和开发的思考方式。在该书中，作者根据自己多年丰富的实践经验，对EJB的各种笨重臃肿的结构进行了逐一的分析和否定，并分别以简洁实用的方式替换之。至此一战功成，Rod Johnson成为一个改变Java世界的大师级人物。</p>
<p>　　传统J2EE应用的开发效率低，应用服务器厂商对各种技术的支持并没有真正统一，导致J2EE的应用没有真正实现Write Once及Run Anywhere的承诺。Spring作为开源的中间件，独立于各种应用服务器，甚至无须应用服务器的支持，也能提供应用服务器的功能，如声明式事务等。</p>
<p>　　Spring致力于J2EE应用的各层的解决方案，而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的&ldquo;一站式&rdquo;选择，并贯穿表现层、业务层及持久层。然而，Spring并不想取代那些已有的框架，而是与它们无缝地整合。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-16 15:23:01.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring与Struts1的集成]]></title>
		<link>http://www.javawind.net/8a8080a229d3b0a10129d3ea0c480002.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>Spring和Struts整合的价值在于将Struts使用的BO或DAO 乃至Action交给Spring管理，从而充分利用Spring强大的IoC和AOP 特性。</p>
<p>无论使用哪种方式整合，都需要为 Struts装载 Spring 应用上下文环境。有以下三种方式：</p>
<p><strong>1) 在struts-config.xml中使用Struts Plugin</strong></p>
<p>&lt;plug-in className=&quot;org.springframework.web.struts.ContextLoaderPlugIn&quot;&gt; <br />
&lt;set-property property=&quot;contextConfigLocation&quot; <br />
value=&quot;/WEB-INF/classes/applicationContext.xml,/WEB-INF/action-servlet.xml&quot;/&gt; <br />
&lt;/plug-in&gt;</p>
<p><strong>2) 在web.xml中使用ContextLoaderListener</strong></p>
<p>&lt;context-param&gt; <br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; <br />
&lt;param-value&gt;/WEB-INF/classes/applicationContext.xml&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
&lt;listener&gt; <br />
&lt;listener-class&gt; <br />
org.springframework.web.context.ContextLoaderListener <br />
&lt;/listener-class&gt; <br />
&lt;/listener&gt;</p>
<p><strong>3) 在web.xml中使用ContextLoaderServlet</strong></p>
<p>&lt;context-param&gt; <br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; <br />
&lt;param-value&gt;/WEB-INF/classes/applicationContext.xml&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
&lt;servlet&gt; <br />
&lt;servlet-name&gt;SpringContextServlet&lt;/servlet-name&gt; <br />
&lt;servlet-class&gt; <br />
org.springframework.web.context.ContextLoaderServlet <br />
&lt;/servlet-class&gt; <br />
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />
&lt;/servlet&gt;</p>
<p><strong>注意：</strong>用Struts PlugIn的方式加载Spring配置文件有可能导致DWR无法取得Spring中定义的bean，因为DWR有可能先于Struts被访问使用，而此时Struts配置文件还未加载！<br />
因此，在Spring、Struts和DWR 集成时，应该在web.xml中通过ContextLoaderLisenter或ContextLoaderServlet加载Spring配置文件。<br />
最佳实践是使用Struts PlugIn的方式加载Struts Action配置文件/WEB-INF/action-servlet.xml，而使用ContextLoaderLisenter或ContextLoaderServlet方式加载Spring配置文件applicationContext.xml，通过两次加载完成Spring所有配置文件的加载。</p>
<p><strong>至少有四种Spring与Struts整合方式：</strong></p>
<p><strong>1. 手工创建Spring 环境整合 Spring和Struts</strong></p>
<p>为了Web应用环境可以和Spring的IoC容器很好的结合，Spring提供了专门用于Web应用环境中的Spring容器&mdash;&mdash;WebApplicationContext。使用ContextLoaderPlugIn装载 Spring 应用程序环境时，ContextLoaderPlugIn会自动创建一个WebApplicationContext对象，并加载相应的配置文件，然后将其保存在ServletContext中。之后所有的Servlet或Action便都可以过ServletContext访问该WebApplicationContext实例并从中获取BO或DAO Bean。</p>
<p>ServletContext servletContext=this.getServlet().getServletContext(); <br />
WebApplicationContext ctx= <br />
WebApplicationContextUtils.getWebApplicationContext(servletContext); <br />
UserInfoDAO userInfoDAO=(UserInfoDAO)ctx.getBean(&quot;userInfoDAO&quot;);</p>
<p><strong>2. 使用 Spring 的 ActionSupport 类整合 Struts</strong></p>
<p>org.springframework.web.struts.ActionSupport 类提供了一个 getWebApplicationContext() 方法可以获取到WebApplicationContext实例，您所做的只是从 Spring 的 ActionSupport 而不是 Struts Action 类扩展您的动作：</p>
<p>public class AddActionSupport extends ActionSupport { <br />
public ActionForward execute(ActionMapping mapping, ActionForm form, <br />
HttpServletRequest request, HttpServletResponse response) { <br />
AddForm addForm = (AddForm) form; <br />
UserInfo user=new UserInfo(); <br />
user.setUserName(addForm.getName()); <br />
user.setUserPwd(addForm.getPassword()); <br />
UserInfoDAO userInfoDAO= <br />
(UserInfoDAO)getWebApplicationContext().getBean(&quot;userInfoDAO&quot;); <br />
userInfoDAO.save(user); <br />
return mapping.findForward(&quot;success&quot;); <br />
} <br />
}</p>
<p>结论：第1、2种整合方式由Spring来管理BO或DAO Bean，实现了表示层和业务逻辑层的解耦，但Struts的Action和Spring耦合在了一起，违反了Spring&ldquo;非侵入&rdquo;性原则；另外,Action类负责查找由Spring管理的Bean,也违背了Spring控制反转(IoC)的原则。以下第3、4种整合方式实现了由Spring来管理Struts Action，实现了Struts和Spring的解耦，从而解决了以上问题。</p>
<p><strong>3. 使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor</strong></p>
<p>用Spring的DelegatingRequestProcessor重载Struts 默认的 RequestProcessor。这样当收到一个针对Action的请求时，DelegatingRequestProcessor会自动从Spring Context中查找对应的Action Bean。</p>
<p>在struts-config.xml中添加：</p>
<p>&lt;controller processorClass=&quot;org.springframework.web.struts.DelegatingRequestProcessor&quot;/&gt;</p>
<p><strong>4. 【最佳方案】使用DelegatingActionProxy将Struts Action 管理全权委托给 Spring 框架</strong></p>
<p>即：使用spring的aop动态代理机制<br />
Action 的创建和对象的依赖注入全部由IOC容器来完成，使用Spring的DelegatingAcionProxy来帮助实现代理的工作。DelegatingActiongProxy继承于org.apache.struts.action.Action 。此时需要将struts-config.xml中所有Action类别全部配置为 org.springframework.web.struts.DelegatingActionProxy：</p>
<p>&lt;action attribute=&quot;loginForm&quot; input=&quot;/login.jsp&quot; name=&quot;loginForm&quot; path=&quot;/login&quot; scope=&quot;request&quot; type=&quot;org.springframework.web.struts.DelegatingActionProxy&quot;&gt; <br />
&lt;forward name=&quot;error&quot; path=&quot;/error.html&quot; /&gt; <br />
&lt;forward name=&quot;success&quot; path=&quot;/success.html&quot; /&gt; <br />
&lt;/action&gt;</p>
<p>3、4两种方式都需要在WEB-INF下新建一个action-servlet.xml作为Spring context文件，创建Struts Action Bean，并对Action进行BO或DAO Bean注入：</p>
<p>&lt;!--name 的取值一定要和Struts 配置文件action 中的path 的值相对应--&gt; <br />
&lt;bean name=&quot;/login&quot; class=&quot;cn.qdqn.ssh.struts.action.LoginAction&quot;&gt; <br />
&lt;property name=&quot;userBO&quot;&gt; <br />
&lt;ref bean=&quot;userBO&quot;/&gt; <br />
&lt;/property&gt; <br />
&lt;/bean&gt;</p>
<p>结论：以上2种方式实现了由Spring管理Struts的Action，从而可以利用Spring在Struts Action中轻松的注入BO或DAO，还可以将 Spring 的 AOP 拦截器应用于Struts 动作，用最小的代价处理横切关注点。</p>
<p>第3种整合方式只需要配置一个&lt;controller&gt;，不需要改动Struts Action配置信息，但Struts的 RequestProcessor只能被重载一次，如果在应用中还要进行编码等其它功能RequestProcessor重载时，此种方式将异常繁琐。</p>
<p>第4种整合方式可以避免RequestProcessor的占用，但必须将struts-config.xml中所有Action类别全部配置为 org.springframework.web.struts.DelegatingActionProxy。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2010-07-15 10:23:38.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Cannot find the declaration of element "beans"]]></title>
		<link>http://www.javawind.net/5b016f382218328f01223f578b07050c.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>今天第一次学习配置spring，按照教程配置好的时候，启动异常：</p>
<p>2009-7-3 14:30:05 org.springframework.context.support.AbstractApplicationContext prepareRefresh<br />
信息: Refreshing <a href="mailto:org.springframework.context.support.FileSystemXmlApplicationContext@c1b531">org.springframework.context.support.FileSystemXmlApplicationContext@c1b531</a>: display name [org.springframework.context.support.FileSystemXmlApplicationContext@c1b531]; startup date [Fri Jul 03 14:30:05 CST 2009]; root of context hierarchy<br />
2009-7-3 14:30:05 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions<br />
信息: Loading XML bean definitions from file [D:\MyWorkSpace\jwcms\bean.xml]<br />
Exception in thread &quot;main&quot; org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 2 in XML document from file [D:\MyWorkSpace\jwcms\bean.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.<br />
&nbsp;at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)<br />
&nbsp;at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)<br />
&nbsp;at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)<br />
&nbsp;at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)<br />
&nbsp;at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)<br />
&nbsp;at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)<br />
&nbsp;at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)<br />
&nbsp;at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)<br />
&nbsp;at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:80)<br />
&nbsp;at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)<br />
&nbsp;at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422)<br />
&nbsp;at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)<br />
&nbsp;at org.springframework.context.support.FileSystemXmlApplicationContext.&lt;init&gt;(FileSystemXmlApplicationContext.java:140)<br />
&nbsp;at org.springframework.context.support.FileSystemXmlApplicationContext.&lt;init&gt;(FileSystemXmlApplicationContext.java:84)<br />
&nbsp;at com.javawind.test.TestQuickStart.testQuickStart(TestQuickStart.java:15)<br />
&nbsp;at com.javawind.test.TestQuickStart.main(TestQuickStart.java:11)<br />
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.<br />
&nbsp;at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)<br />
&nbsp;at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1887)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)<br />
&nbsp;at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)<br />
&nbsp;at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)<br />
&nbsp;at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)<br />
&nbsp;at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)<br />
&nbsp;at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)<br />
&nbsp;at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)<br />
&nbsp;at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)<br />
&nbsp;at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)<br />
&nbsp;... 15 more</p>
<p><span style="color: #0000ff"><strong>google一番后得到解决方法，bean.xml 如下：</strong></span></p>
<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
<span style="color: #ff0000">&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN 2.0//EN&quot; &quot;</span><a href="http://www.springframework.org/dtd/spring-beans-2.0.dtd"><span style="color: #ff0000">http://www.springframework.org/dtd/spring-beans-2.0.dtd</span></a><span style="color: #ff0000">&quot;&gt;</span><br />
&lt;beans&gt;</p>
<p>原来我少了红色的那行，补充上去就好了。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2009-07-03 14:40:17.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring 开发指南 (Spring_Dev_Guide)[pdf]]]></title>
		<link>http://www.javawind.net/5b016f3820d37b010120f4e9b6c105d4.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p><strong>Spring 开发指南 V0.8 预览版 </strong>(作者：夏昕)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpringFramework 实际上是Expert One-on-One J2EE Design and Development 一书中所阐述的设计思想的具体实现。在One-on-One 一书中，Rod Johnson 倡导J2EE 实用主义的设计思想，并随书提供了一个初步的开发框架实现（interface21 开发包）。而SpringFramework 正是这一思想的更全面和具体的体现。Rod Johnson 在interface21 开发包的基础之上，进行了进一步的改造和扩充，使其发展<br />
为一个更加开放、清晰、全面、高效的开发框架。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文正是针对SpringFramework的开发指南，讲述了SpringFramework的设计思想以及在开发中的实际使用。同时穿插了一些笔者在项目实作中的经验所得。</p>
<p><strong>下载：</strong><a title="点击下载附件" target="_blank" href="Upload/2009-04/30_1046_F266751.pdf"><img alt="下载附件" border="0" src="http://www.javawind.net/images/filetype/pdf.gif" /> 30_1046_F266751.pdf</a></p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2009-04-30 10:45:38.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring WebFlow：重用与抽象框架解析之一]]></title>
		<link>http://www.javawind.net/5b016f3820d37b010120e5c15242029c.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>Spring WebFlow是一个全新的Web框架，她带给我们一种全新且高度结构化的Web应用构建方法。让我们来看看她的一些特性。</p>
<p>Spring框架正准备推出一种新的技术。在下一个版本中Spring将正式将Spring WebFlow整合进来。Spring WebFlow是一个及其优秀的Web开发框架，用于在Web应用内部创建和配置可重用的Web流程。</p>
<p>熟悉Spring的人可能先入为主地以为Spring WeFlow和SpringMVC没有什么区别。那就错了。Spring MVC是一个轻量级的Web开发框架，而Spring WebFlow 则提出一种全新的视角。她使得Web架构师们可以将精力集中在Web应用开发的抽象层次上:Web流程的逻辑结构和Web事件条件的定义。此外，她还提出许多新的概念。</p>
<p>本文将回顾这一个新框架前的一些关键概念，用一个经典的用户登录例子来分析流程标记语言的主要组成元素并向您解释为什么WebFlow如此诱人。</p>
<p>Spring WebFlow 概念和组件作为一个Web框架，WebFlow无论在理论上还是在实际开发上都有诸多优点。深厚的软件工程学架构保证了他的稳定性，同时，其组件合理，易于理解，易于使用。</p>
<p>事实上，它更适合中大型应用的开发，因为它的组件模型专门针对架构重用，高效管理性和可配置性进行了优化。</p>
<p>用例研究</p>
<p>本文以一个常见的web应用流程作为示例，一个身份认证流程，讲解它的一些代码片断。一个Web认证的全过程包括:登录表单，注册表单，认证action，注册action，以及对这些action的结构修饰。这个例子用来展示那些修饰登录表单的组件的配置。</p>
<p>自动操作架构</p>
<p>Spring WebFlow以有限自动机(Finite State machine)的概念为基础。Web应用内部的用户交互行为和事务被建模为一般的状态机，这是一种非常流行的软件工程建模方法。(见图1)。自动机为基础的设计是一种很好的设计方法，同时正在越来越收到应用架构的青睐&mdash;&mdash;因为它在对Web交互行为建模时显得相对清晰且严谨。</p>
<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</p>
<p>&lt;!DOCTYPE webflow PUBLIC &quot;-//SPRING//DTD WEBFLOW//EN&quot;<br />
&quot;http://www.springframework.org/dtd/spring-webflow.dtd&quot;&gt;<br />
&lt;webflow id=&quot;LoginSequence&quot; start-state=&quot;loginForm&quot;&gt;</p>
<p>&lt;action-state id=&quot;loginForm&quot;&gt;<br />
&lt;action bean=&quot;loginFormAction&quot;/&gt;<br />
&lt;transition on=&quot;success&quot; to=&quot;formView&quot;/&gt;<br />
&lt;/action-state&gt;<br />
...<br />
&lt;view-state id=&quot;formView&quot; view=&quot;enterCredentials&quot;&gt;<br />
&lt;transition on=&quot;submit&quot; to=&quot;bindAndValidateForm&quot;/&gt;<br />
&lt;/view-state&gt;<br />
...<br />
&lt;end-state id=&quot;successView&quot; view=&quot;displayMain&quot;/&gt;</p>
<p>这个流程以loginForm开始，以&quot;successView&quot;结束(修饰主页面&quot;displayMain&quot; 的组件。流程可以通过XML文档配置，或者AbstractFlowBuilder的子类。</p>
<p>动作状态(ActionStates)</p>
<p>ActionStates对用户事件或其他事件进行响应。ActionStates自身又可以包含其他可执行的Action和transition。下面的代码配置了&quot;loginForm&quot;这个ActionState。</p>
<p>&lt;action-state id=&quot;loginForm&quot;&gt;<br />
&lt;action bean=&quot;loginFormAction&quot;/&gt;<br />
&lt;transition on=&quot;success&quot; to=&quot;formView&quot;/&gt;<br />
&lt;/action-state&gt;&nbsp;</p>
<p>动作(Actions)</p>
<p>Action是ActionState可以连接，重用，声明调用的最小单位。Action继承自AbstractAction类，该类实现了doExecuteAction方法。这个方法的参数:RequestContext，WebFlow(其中封装了所有流程相关的数据)。</p>
<p>loginForm动作状态通过Spring的自动装配特性调用LoginFormAction动作。doExecute</p>
<p>Action方法被自动调用，同时可以处理一些登录准备，预先装入等操作。</p>
<p>public LoginFormAction extends AbstractAction<br />
{</p>
<p>protected Event doExecuteAction<br />
(RequestContext context) <br />
throws Exception<br />
{<br />
//perform some login specific setup operations<br />
...</p>
<p>}//end method</p>
<p>}//end class</p>
<p>显示状态(ViewState)</p>
<p>ViewState初始化对显示组件(jsp，tile等)的修饰操作。下面是一个ViewState的配置代码：</p>
<p>&lt;view-state id=&quot;formView&quot; view=&quot;enterCredentials&quot;&gt;<br />
&lt;transition on=&quot;submit&quot; to=&quot;bindAndValidateForm&quot;/&gt;<br />
&lt;/view-state&gt;</p>
<p>当来自loginForm的ActionState返回一个&quot;success&quot;时，这个ViewState将会被调用。它将修饰&quot;enterCredentials&quot;显示组件(可以是一个常见的struts forward)。</p>
<p>跳转(Transition)</p>
<p>和通常的状态机一样，WebFlow定义了状态以及状态之间跳转动作。这些跳转动作很类似struts中的ActionForward。同样是负责连接两个状态。</p>
<p>后继动作(Continuation)</p>
<p>后继动作(Continuation)允许你回退并重新开始程序执行流程&mdash;&mdash;从程序执行的角度来看是一个适时的逆流程。Continuation的概念最早来自编程语言，但是却从来没有被用于像Java，VB，C++这样主流的编程语言中。WebFlow创造性地实现了continuation。由于continuation可以用来持久和重造任何一个流程状态，从而提供给你极大的自由。</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2009-04-27 12:07:13.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring的三种配置数据源的方式]]></title>
		<link>http://www.javawind.net/5b016f38209b22bf0120d1480501092d.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p><strong>（1）：加载properties文件方式</strong></p>
<p>properties文件加载有两种方式</p>
<p>(a) src下config下所有后缀为properties的文件全部加载</p>
<p>&lt;context:property-placeholder location=&quot;classpath*:config/*.properties&quot;/&gt;</p>
<p>(b) 加载指定位置的properties文件</p>
<p>&lt;bean id=&quot;propertyConfigurer&quot;<br />
class=&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&quot;&gt;<br />
&lt;property name=&quot;location&quot;&gt;<br />
&lt;value&gt;/WEB-INF/classes/configure.properties&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p><strong>properties文件引用方式</strong></p>
<p>&lt;bean id=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;<br />
p:driverClassName=&quot;${jdbc.driverClassName}&quot; <br />
p:url=&quot;${jdbc.url}&quot; <br />
p:username=&quot;${jdbc.username}&quot;<br />
p:password=&quot;${jdbc.password}&quot;/&gt;</p>
<p><strong>（2）：把jndi的字符串配置到properties文件中读取！</strong></p>
<p>&lt;bean id=&quot;dataSource1&quot; class=&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;&gt;<br />
&lt;property name=&quot;jndiName&quot;&gt;<br />
&lt;value&gt;${jdbc.dataSource}&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p><strong>（3）：直接给定jndi的字符串</strong></p>
<p>&lt;jee:jndi-lookup id=&quot;dataSource3&quot; jndi-name=&quot;java:comp/env/jdbc/ExampleDB&quot; /&gt;</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2009-04-23 12:42:19.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring中遇到问题,请高手解答]]></title>
		<link>http://www.javawind.net/5b016f381c502058011ca611fa1e0a20.jhtml</link>
		<author>gy93108083</author>  
		<description><![CDATA[<div class="t_msgfont" id="postmessage_1316756">最近用Spring遇到一个问题<br />
<br />
<br />
<br />
&lt;beans&gt;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;bean name=&quot;mydao&quot; class=&quot;com.app.dao.DAO&quot;&gt;&lt;/bean&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;bean name=&quot;myservice&quot; class=&quot;com.app.service.Service&quot;&gt;&lt;/bean&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&lt;/beans&gt;<br />
<br />
<br />
<br />
package com.app.dao;<br />
<br />
public class DAO {<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public DAO() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;create dao !!!!!&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
}<br />
<br />
<br />
<br />
package com.app.service;<br />
<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
import com.app.dao.DAO;<br />
<br />
public class Service {<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; private static ApplicationContext context = null;<br />
&nbsp; &nbsp; &nbsp; &nbsp; static{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new ClassPathXmlApplicationContext(&quot;applicationContext.xml&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;after create context!!! &quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public Service() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;create Serice!!!!&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public void UseService(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;before get dao!!!&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DAO dao= (DAO)context.getBean(&quot;mydao&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;after get dao! &quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
}<br />
<br />
<br />
<br />
<br />
package com.app.test;<br />
<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
public class Test {<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; /**<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;* @param args<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; &nbsp; &nbsp; public static void main(String[] args) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ApplicationContext context = new ClassPathXmlApplicationContext(&quot;applicationContext.xml&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
}<br />
<br />
<br />
这样的代码运行没有问题<br />
<br />
但是,如果把service里改成<br />
<br />
<br />
<br />
<br />
public class Service {<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; ApplicationContext context = new ClassPathXmlApplicationContext(&quot;applicationContext.xml&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public Service() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;create Serice!!!!&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public void UseService(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;before get dao!!!&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DAO dao= (DAO)context.getBean(&quot;mydao&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&quot;after get dao! &quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
}<br />
<br />
<br />
就会出现死循环,请问这是什么原因导致的??????????????????????????</div>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-09-28 07:08:28.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[【对于Spring初学者的学习建议】]]></title>
		<link>http://www.javawind.net/5b016f381c2a8ba0011c355cd13e00ff.jhtml</link>
		<author>suieui</author>  
		<description><![CDATA[<p>一、首先Java的基础、面向对象的基础和设计模式的基础知识是必不可少的。<br />
　　关于设计模式我觉得不用学太多，但以下三个模式是学习Spring必不可少的：factory模式（包括简单工厂和抽象工厂），Strategy模式，Template method模式。如果不掌握这些你就根本没法领悟Spring的精髓，只能依样画葫芦地照搬，这是很可怕的事。</p>
<p>　　我这里强烈建议的书可能让人有点意外，那就是Expert one on one J2EE design and development的第四章，这一章不仅仅是Spring初学者，而是任何搞Java开发的人必读的一章。经典！</p>
<p>　　二、接下可以看一些Spring的入门书籍<br />
&nbsp;　其实我自己没怎么看过这方面的书，我当时只看过Spring的reference，不过现在这方面的书好象多的是，而Spring reference看起来还是有些吃力的。JavaEye上很多人建议夏昕的Spring开发指南，据说入门很容易。另外的入门书应该是Spring live或Spring in action。我大概扫了一下，Spring live是一本只讲怎么做而不讲为什么的书，我不太喜欢（偶尔参考一下倒不错），不过有些人特别喜欢这样的书，看自己的个人爱好吧。</p>
<p>　　三、研究几个用Spring做的开源项目 <br />
　　理论还是要与实际结合，所以看完书后是要看实际的项目的。很多人喜欢appfuse，我觉得appfuse花的东西太多，真正实质性的内容又太少。我更喜欢Spring自带的jpetstore，这是一个非常完整的例子，看完后Spring的基本用法应该都能掌握。</p>
<p>　　四、开始做实际的项目 <br />
　　在上述这些都完备以后，我觉得应该要去实际项目中锻炼了。当然并不是每人都有这样的机会的，这时只能自己做个玩具项目啦。项目的锻炼是非常关键的，其实每个人都清楚，我就不重复了。</p>
<p>　　五、继续深入学习 <br />
　　经过项目的锤炼，对Spring的用法和原理有了一定的了解的时候，才有可能真正掌握Spring的精髓。这时要读的书才是Rod Johnson的三本经典名著，分别是：</p>
<p>　　Expert one on one J2ee design and development</p>
<p>　　Expert one on one J2ee without EJB</p>
<p>　　Professional Java Development with SpringFramework</p>
<p>　　前两本书的经典程度我就不说了，只有读了它们，才能真正了解Spring的设计意图，掌握Spring的精髓。</p>
<p>　　第三本书是我强烈不建议初学者读的书。里面的东西深入而全，但是原理讲解得又不够深，很容易让初学者犯迷糊。但是却是Spring的高级用户必读的一本书（还有一本pro Spring据说也不错，不过我没读过）。我过几天会写一下这本书的书评。</p>
<p>　　当然这个阶段与第四阶段是交错的，边读书边做项目学到的东西才会更多的。</p>
<p>　　六、分析源代码，扩展Spring <br />
　　有人认为没有必要分析Spring的源代码，因为这是很累人又不计好的事。但是要想成为Spring的高级用户，这是必经的阶段。在学习的过程中，我们学到的不仅是Spring，更重要的是他的设计思想。不管怎样，看牛人的源代码是绝对有好处的。不过这是一个很累人的过程，要有思考准备哦！ <br />
&nbsp; <br />
想学习J2EE与SPring的朋友，特推荐《轻量级J2EE企业应用实战》与《Spring 2.0宝典》是由李刚老师――东方标准（原新东方职业教育中心）广州中心软件教学总监所编，李刚老师在新东方担任培训讲师期间，培训了大量优秀学生，已经在华为、网易、亿阳、立信、普信、中企动力等公司就职，在珠三角的J2EE行业极具号召力。有机会大家也可以去了解下！教学地址就在广州华南师范大学计算机学院6楼。或者可访问：<a href="http://soft.oneedu.cn">http://soft.oneedu.cn</a><br />
&nbsp;</p>
<p>&nbsp;</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-09-06 09:53:07.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[＆◆Spring学习笔记◆＆]]></title>
		<link>http://www.javawind.net/5b016f381b62cd71011b9b19ba4006d4.jhtml</link>
		<author>kitymao200</author>  
		<description><![CDATA[<p>&nbsp;</p>
<div style="background: #f9fcfe; text-indent: 10.5pt; line-height: 17.25pt" align="left"><span style="color: black"><img alt="" src="/fckeditor/editor/images/smiley/msn/regular_smile.gif" />计划用一个月时间来学习</span><span style="color: black"><a href="http://soft.oneedu.cn/class_show1.html">Spring</a></span><span style="color: black">，在这里把自己的学习过程记录下来，方便想学习</span><span style="color: black">Spring</span><span style="color: black">的人，也为自己日后复习有个参考。以下通过一个简单的例子来先了解下</span><span style="color: black"><a href="http://soft.oneedu.cn/class_show1.html">Spring</a></span><span style="color: black">的用法。</span><span style="color: black"><br />
(1)</span><span style="color: black">创建一个</span><span style="color: black"><a href="http://soft.oneedu.cn/class_show1.html">java</a></span><span style="color: black">工程，建立如下类：</span><span style="color: black">HelloBean </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">package com.ducklyl; </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">public class HelloBean {<br />
&nbsp;private String helloWord; </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">&nbsp;public String getHelloWord() {<br />
&nbsp;&nbsp;return helloWord;<br />
&nbsp;} </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">&nbsp;public void setHelloWord(String helloWord) {<br />
&nbsp;&nbsp;this.helloWord = helloWord;<br />
&nbsp;} </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black"><br />
}</span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black"><br />
(2)</span><span style="color: black">创建</span><span style="color: black">Spring</span><span style="color: black">配置文件：</span><span style="color: black">beans-config.xml</span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;&gt; </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">&lt;beans&gt;<br />
&lt;bean id=&quot;helloBean&quot; class=&quot;com.ducklyl.HelloBean&quot;&gt;<br />
&nbsp;&lt;property name=&quot;helloWord&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;Hello,ducklyl!&lt;/value&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt; </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">&lt;/beans&gt;<br />
<br />
(3)</span><span style="color: black">导入</span><span style="color: black">Spring</span><span style="color: black">所需的包：</span><span style="color: black">commons-logging.jar</span><span style="color: black">，</span><span style="color: black">spring.jar </span><span style="color: black">。</span><span style="color: black">(</span><span style="color: black">日志包和</span><span style="color: black">Spring</span><span style="color: black">包</span><span style="color: black">)<br />
</span><span style="color: black">包下载地址：</span><span style="color: black"><br />
http://www.blogjava.net/Files/ducklyl/Spring.rar<br />
(4)</span><span style="color: black">创建测试类：</span><span style="color: black">SpringDemo.java</span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">package com.ducklyl; </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black">import org.springframework.core.io.FileSystemResource;<br />
import org.springframework.core.io.Resource;<br />
import org.springframework.beans.factory.BeanFactory;<br />
import org.springframework.beans.factory.xml.*; </span></div>
<div style="background: #f9fcfe; line-height: 17.25pt" align="left"><span style="color: black"><br />
public class SpringDemo{<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;//</span><span style="color: black">读取配置文件</span><span style="color: black"><br />
&nbsp;&nbsp;Resource rs=new FileSystemResource(&quot;beans-config.xml&quot;);<br />
&nbsp;&nbsp;//</span><span style="color: black">实例化</span><span style="color: black">Bean</span><span style="color: black">工厂</span><span style="color: black"><br />
&nbsp;&nbsp;BeanFactory factory=new XmlBeanFactory(rs);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//</span><span style="color: black">获取</span><span style="color: black">id=&quot;helloBean&quot;</span><span style="color: black">对象</span><span style="color: black"><br />
&nbsp;&nbsp;HelloBean hello=(HelloBean)factory.getBean(&quot;helloBean&quot;);<br />
&nbsp;&nbsp;//</span><span style="color: black">调用</span><span style="color: black">helloBean</span><span style="color: black">对象</span><span style="color: black">getHelloWord()</span><span style="color: black">方法</span><span style="color: black"><br />
&nbsp;&nbsp;System.out.println(hello.getHelloWord());<br />
&nbsp;} </span></div>
<div><span style="color: black">}<br />
<br />
</span><span style="color: black">如果以上配置正确的话，运行</span><span style="color: black">SpringDemo.java</span><span style="color: black">，可以看到输出结果：</span><span style="color: black">Hello,ducklyl</span><span style="color: black">！</span></div>
<div style="line-height: 150%"><img alt="" src="/fckeditor/editor/images/smiley/msn/regular_smile.gif" />
<p style="line-height: 150%"><font size="3"><font face="宋体">要想了解更多<span lang="EN-US"><a href="http://soft.oneedu.cn/class_show1.html">JAVA</a></span>知识<span lang="EN-US">,</span>请访问<span lang="EN-US"><a href="http://soft.oneedu.cn/"><span style="line-height: 150%; mso-bidi-font-size: 10.5pt">http://soft.oneedu.cn/</span></a></span></font></font><span lang="EN-US" style="font-size: 9pt; line-height: 150%; font-family: Tahoma"><o:p></o:p></span></p>
</div>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-08-07 10:58:19.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring 基础教程(三)]]></title>
		<link>http://www.javawind.net/5b016f381b4725ef011b4befa59c0078.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>属性编辑器: PropertyEditorSupport<br />
作用:如果一个类中的属性为Date类型,那么在beans.xml中设置的Date值不能与Date匹配,那么我们需要对beans.xml中的属性进行编辑,让它转化为Date类型的<br />
CustomEditorConfigurer可以读取实现java.beans.PropertyEditor接口的类,将字符串转为指定的类型,更方便的使用PropertyEditorSupport.PropertyEditorSupport实现PropertyEditor,必须重新定义setAsText<br />
程序目标:如果bean类中有不是一般类型的属性的话,并且在xml文件中有这个属性的赋值，那么可以使用属性编辑器对属性进行类型的封装，然后通过org.springframework.beans.factory.config.CustomEditorConfigurer类在xml中与属性编辑器处理类绑定<br />
接口:<br />
package yuchen.dataeditor;<br />
&nbsp;<br />
public interface A {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.dataeditor;<br />
&nbsp;<br />
import java.util.Date;<br />
&nbsp;<br />
public class AImp implements A {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Date date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(date instanceof Date){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Date getDate() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setDate(Date date) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.date = date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
属性编辑器类<br />
package yuchen.dataeditor;<br />
&nbsp;<br />
import java.beans.PropertyEditorSupport;//属性编辑器<br />
import java.util.Calendar;<br />
import java.util.Date;<br />
import java.util.GregorianCalendar;<br />
&nbsp;<br />
public class DateEditor extends PropertyEditorSupport {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Date date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setAsText(String str) throws IllegalArgumentException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] a=str.split(&quot;/&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int year = Integer.parseInt(a[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int month = Integer.parseInt(a[1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int day = Integer.parseInt(a[2]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar cal= new GregorianCalendar(year,month-1,day);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date = cal.getTime();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object getValue() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; <br />
&quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;a&quot; class=&quot;yuchen.dataeditor.AImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;date&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;1998/07/07&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean <br />
class=&quot;org.springframework.beans.factory.config.CustomEditorConfigurer&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;customEditors&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key=&quot;java.util.Date&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean <br />
class=&quot;yuchen.dataeditor.DateEditor&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.dataeditor;<br />
/*<br />
&nbsp;* 属性编辑器:java.beans.PropertyEditorSupport<br />
&nbsp;* 如何知道属性编辑器类为谁服务呢?<br />
&nbsp;* &lt;bean <br />
class=&quot;org.springframework.beans.factory.config.CustomEditorConfigurer&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;customEditors&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key=&quot;java.util.Date&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean <br />
class=&quot;yuchen.dataeditor.DateEditor&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;*/<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new <br />
ClassPathXmlApplicationContext(&quot;yuchen/dataeditor/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A aa=(A) context.getBean(&quot;a&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aa.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
属性设置器:<br />
除了通过beans.xml设置属性以外，还可以通过PropertyPlaceholderConfigurer为bean属性设置值，它利用属性文件<br />
程序目标:测试PropertyPlaceholderConfigurer类<br />
&nbsp;<br />
接口:<br />
package yuchen.propertyphc;<br />
&nbsp;<br />
public interface A {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.propertyphc;<br />
&nbsp;<br />
import java.util.Date;<br />
&nbsp;<br />
public class AImp implements A {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Date date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(date instanceof Date){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Date getDate() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setDate(Date date) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.date = date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
属性编辑器:<br />
package yuchen.propertyphc;<br />
&nbsp;<br />
import java.beans.PropertyEditorSupport;//属性编辑器<br />
import java.util.Calendar;<br />
import java.util.Date;<br />
import java.util.GregorianCalendar;<br />
&nbsp;<br />
public class DateEditor extends PropertyEditorSupport {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Date date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setAsText(String str) throws IllegalArgumentException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] a=str.split(&quot;/&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int year = Integer.parseInt(a[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int month = Integer.parseInt(a[1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int day = Integer.parseInt(a[2]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar cal= new GregorianCalendar(year,month-1,day);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date = cal.getTime();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object getValue() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return date;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
属性文件:<br />
date=2001/10/3<br />
&nbsp;<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; <br />
&quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;a&quot; class=&quot;yuchen.propertyphc.AImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;date&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${date}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean <br />
class=&quot;org.springframework.beans.factory.config.CustomEditorConfigurer&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;customEditors&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key=&quot;java.util.Date&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean <br />
class=&quot;yuchen.propertyphc.DateEditor&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean <br />
class=&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigur<br />
er&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;locations&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;value&gt;yuchen/propertyphc/AImp.properties&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.propertyphc;<br />
/*<br />
&nbsp;* 属性设置器:<br />
&nbsp;* 通过属性文件给bean的属性设置值<br />
&nbsp;* 在beans.xml中添加属性设置器类:<br />
&nbsp;* &lt;bean <br />
class=&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigur<br />
er&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;locations&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;value&gt;yuchen/propertyphc/AImp.properties&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 属性文件:<br />
&nbsp;&nbsp;&nbsp;&nbsp; date=2001/10/3<br />
&nbsp;*/<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new <br />
ClassPathXmlApplicationContext(&quot;yuchen/propertyphc/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A aa=(A) context.getBean(&quot;a&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aa.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
属性覆盖器:<br />
作用:属性文件中设置好的属性值将会覆盖掉beans.xml中类属性值<br />
接口:<br />
package yuchen.propertypoc;<br />
&nbsp;<br />
public interface A {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.propertypoc;<br />
&nbsp;<br />
import java.util.Date;<br />
&nbsp;<br />
public class AImp implements A {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(this.name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; <br />
&quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;a&quot; class=&quot;yuchen.propertypoc.AImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;name&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;zhao&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean <br />
class=&quot;org.springframework.beans.factory.config.PropertyOverrideConfigurer&quot;<br />
&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;location&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen/propertypoc/AImp.properties&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
属性文件:<br />
a.name=yuchen<br />
&nbsp;<br />
Test:<br />
package yuchen.propertypoc;<br />
/*<br />
&nbsp;* 覆盖:<br />
&nbsp;* 使用PropertyOverrideConfigurer那么属性文件中设置的属性值<br />
&nbsp;* 会覆盖在beans.xml 的bean类中设置的属性值<br />
&nbsp;*/<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new <br />
ClassPathXmlApplicationContext(&quot;yuchen/propertypoc/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A aa=(A) context.getBean(&quot;a&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aa.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
ApplicationContext的事件特性(观察者模式):<br />
1.ApplicationContext发布事务<br />
2.事件响应者需要实现ApplicationListener<br />
3.定义一个事件类,继承ApplicationEvent<br />
接口:<br />
package yuchen.event;<br />
&nbsp;<br />
public interface Model {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String superDate();<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void update();<br />
}<br />
&nbsp;<br />
接口:<br />
package yuchen.event;<br />
&nbsp;<br />
public interface View {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.event;<br />
&nbsp;<br />
import org.springframework.beans.BeansException;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.ApplicationContextAware;<br />
import org.springframework.context.ApplicationEvent;<br />
&nbsp;<br />
public class ModelImpl implements Model,ApplicationContextAware{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private ApplicationContext context;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String superDate() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void update(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setName(&quot;zhang&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(context!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.publishEvent(new RefreshEvent(this,&quot;update<br />
()&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;null&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setApplicationContext(ApplicationContext arg0) throws <br />
BeansException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context=arg0;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.event;<br />
&nbsp;<br />
import org.springframework.context.ApplicationEvent;<br />
import org.springframework.context.ApplicationListener;<br />
&nbsp;<br />
public class ViewImpl implements View,ApplicationListener{<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Model model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rst=model.superDate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rst);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Model getModel() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setModel(Model model) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.model = model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void onApplicationEvent(ApplicationEvent arg0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(arg0 instanceof RefreshEvent){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;事件发生后调用onApplicationEvent方法&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
事件类:<br />
package yuchen.event;<br />
&nbsp;<br />
import org.springframework.context.ApplicationEvent;<br />
&nbsp;<br />
public class RefreshEvent extends ApplicationEvent{<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String message;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public RefreshEvent(Object arg0,String message) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(arg0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.message=message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated constructor stub<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getMessage() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return message;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setMessage(String message) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.message = message;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; <br />
&quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;model&quot; class=&quot;yuchen.event.ModelImpl&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;name&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;view&quot; class=&quot;yuchen.event.ViewImpl&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;model&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;model&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.event;<br />
/*<br />
&nbsp;* 程序目标:当更新model里的name时,context发布事件,再次调用display方法<br />
&nbsp;* ApplicationContext用来发布事件<br />
&nbsp;* ApplicationEvent为事件的抽象类,需要继承此类声明一个事件对象<br />
&nbsp;* ApplicationListener监听器监听是否有事件发生,当context发布事件<br />
&nbsp;* 后,会调用实现了此接口的bean中的onApplicationEvent()方法<br />
&nbsp;* 实现ApplicationContextAware的类可获得context<br />
&nbsp;*/<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new <br />
ClassPathXmlApplicationContext(&quot;yuchen/event/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; View v=(View) context.getBean(&quot;view&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;----------------&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ModelImpl m=(ModelImpl)context.getBean(&quot;model&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.update();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
国际化:<br />
ApplicationContext的getMessage方法可以做国际化<br />
并且在beans.xml中需要配置国际化文件的路径<br />
&nbsp;<br />
修改上面的类：将消息的内容国际化<br />
ModelImpl.java:<br />
public void update(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setName(&quot;zhang&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(context!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //context.publishEvent(new RefreshEvent(this,&quot;update()&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.publishEvent(new RefreshEvent(this,context.getMessage(&quot;message&quot;, new String[]{&quot;message&quot;,&quot;!!!!!&quot;}, Locale.CHINA)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;null&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
加入国际化属性文件：<br />
message_zh.properties:<br />
message = {0} \u5237\u65b0 {1}<br />
&nbsp;<br />
Message_en.properties:<br />
message = {0} refresh{1}<br />
&nbsp;<br />
修改beans.xml:<br />
加入：<br />
&lt;bean id=&quot;messageSource&quot; class=&quot;org.springframework.context.support.ResourceBundleMessageSource&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;basenames&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen/event/message&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;<br />
工厂bean:<br />
以前的程序都是通过容器产生工厂，容器的表现有两种<br />
1.XmlBeanFactory<br />
2.ApplicationContext<br />
现在不用得到工厂，通过一个工厂bean去得到bean实例<br />
产生的实例为工厂bean创建的产品,并不是工厂对象<br />
&nbsp;<br />
package yuchen.factorybean;<br />
&nbsp;<br />
import java.util.Properties;<br />
&nbsp;<br />
import org.springframework.beans.factory.FactoryBean;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
Test:<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext factory = new <br />
ClassPathXmlApplicationContext(&quot;yuchen/factorybean/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long s = (Long)factory.getBean(&quot;a&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String classpath = (String)factory.getBean(&quot;classpath&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(classpath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FactoryBean o =(FactoryBean)factory.getBean(&quot;&amp;classpath&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String classpath2 = (String)o.getObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(classpath2);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
beans.xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; <br />
&quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;a&quot; <br />
class=&quot;org.springframework.beans.factory.config.MethodInvokingFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property <br />
name=&quot;targetClass&quot;&gt;&lt;value&gt;java.lang.System&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property <br />
name=&quot;targetMethod&quot;&gt;&lt;value&gt;currentTimeMillis&lt;/value&gt;&lt;/property&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;props&quot; <br />
class=&quot;org.springframework.beans.factory.config.MethodInvokingFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;targetClass&quot; <br />
value=&quot;java.lang.System&quot;&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;targetMethod&quot; value=&quot;getProperties&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;classpath&quot; <br />
class=&quot;org.springframework.beans.factory.config.MethodInvokingFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;targetObject&quot;&gt;&lt;ref <br />
local=&quot;props&quot;/&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;targetMethod&quot; <br />
value=&quot;getProperty&quot;&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;arguments&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;java.class.path&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;/beans&gt;<br />
&nbsp;<br />
面向方面编程AOP:<br />
1.什么是面向方面编程?有什么用?<br />
2.一个陈旧的案例<br />
3.AOP的一些概念<br />
4.第一个AOP程序<br />
5.前置Advice<br />
6.后置Advice<br />
7.环绕Advice<br />
8.异常抛出Advice<br />
&nbsp;<br />
什么是面向方面编程?有什么用?<br />
面向方面编程就是就是将类中掺杂的与业务无关的代码抽象出来,以便重用<br />
作用:重用,解耦合<br />
&nbsp;<br />
包含两个要素:<br />
1.在哪里加入服务(方法前?方法后?属性?)<br />
2.具体为哪个类的哪个方法或属性加入服务<br />
&nbsp;<br />
例如:<br />
1.要在方法前加入事务服务<br />
2.为A类的sayhello()业务方法加入服务<br />
两者组合就是一个方面<br />
&nbsp;<br />
一个陈旧的案例:<br />
程序目标:为A类的业务方法1加入事务和安全的服务,为业务方法2只加入事务的服务<br />
package yuchen.aop.oldcase;<br />
&nbsp;<br />
public class OldCase {<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void execute1(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; safetybackcheck();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;事务开始代码&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.operation1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;事务结束代码&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void execute2(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;事务开始代码&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.operation2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;事务结束代码&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void safetybackcheck(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;安全检查代码&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void operation1(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;业务代码1&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void operation2(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;业务代码2&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
发现问题:业务代码和服务代码互相掺杂,结构不清晰,维护代码不方便,也不方便重用<br />
那么使用AOP编程就是为了解决这个问题<br />
&nbsp;<br />
AOP的一些概念:<br />
关注点:业务核心代码(如: operation1)和系统服务代码(事务,安全代码)都是关注点<br />
横切关注点:程序中的系统服务代码都是横切关注点<br />
核心关注点:就是业务核心代码<br />
方面(aspect):advice+pointcut=aspect,一个方面说明了为哪些类的哪些方法,属性等加入哪些服务,例如:为A类的a()方法加入事务,安全服务,这就是方面<br />
advice: 在哪里加入服务(方法前?方法后?属性?),就是拦截器<br />
pointcut: 具体为哪个类的哪个方法或属性加入服务<br />
连接点:能插入服务的位置是连接点:如:方法,属性,异常抛出,Spring Aop只支持一种类型的连接点(方法)<br />
织入(weaving):就是将方面加入到具体的哪个对象中<br />
Aop代理:Aop Proxy:代理对象,他去调用被包装了服务的业务方法<br />
AOP的目标就是要将横切关注点与核心关注点分离,实现解耦合,重用这些服务<br />
&nbsp;<br />
第一个AOP程序:<br />
接口:<br />
package yuchen.aop.firstaop;<br />
&nbsp;<br />
public interface Business {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void business1();<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void business2();<br />
}<br />
&nbsp;<br />
核心业务类:<br />
package yuchen.aop.firstaop;<br />
&nbsp;<br />
public class BusinessImpl implements Business {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void busMethod1(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.business1();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void busMethod2(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.business2();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void business1() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;核心业务方法1&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void business2() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;核心业务方法2&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
安全服务:<br />
package yuchen.aop.firstaop;<br />
&nbsp;<br />
import java.lang.reflect.Method;<br />
&nbsp;<br />
import org.springframework.aop.MethodBeforeAdvice;<br />
&nbsp;<br />
public class SecuityBeforeAdvice implements MethodBeforeAdvice{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.check();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void check(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;安全检查&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
事务服务:<br />
package yuchen.aop.firstaop;<br />
&nbsp;<br />
import org.aopalliance.intercept.MethodInterceptor;<br />
import org.aopalliance.intercept.MethodInvocation;<br />
&nbsp;<br />
public class AffairAroundAdvice implements MethodInterceptor{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object invoke(MethodInvocation arg0) throws Throwable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.transactionStart();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object object=arg0.proceed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.transactionEnd();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return object;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void transactionStart(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;事务开始&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void transactionEnd(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;事务结束&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
事务服务pointcut:<br />
package yuchen.aop.firstaop;<br />
&nbsp;<br />
import java.lang.reflect.Method;<br />
&nbsp;<br />
import org.springframework.aop.ClassFilter;<br />
import org.springframework.aop.support.StaticMethodMatcherPointcut;<br />
&nbsp;<br />
public class PointcutImpl extends StaticMethodMatcherPointcut{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public boolean matches(Method arg0, Class arg1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(arg0.getName().equals(&quot;business1&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp;&nbsp; public ClassFilter getClassFilter() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ClassFilter(){<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean matches(Class arg0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (arg0==BusinessImpl.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
Test:<br />
package yuchen.aop.firstaop;<br />
/*<br />
&nbsp;* 为类中的某些方法加上事务和安全<br />
&nbsp;*/<br />
import org.springframework.aop.Advisor;<br />
import org.springframework.aop.Pointcut;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
import org.springframework.aop.support.DefaultPointcutAdvisor;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyFactory pf=new ProxyFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Business bi=new BusinessImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SecuityBeforeAdvice sb=new SecuityBeforeAdvice();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pointcut p=new PointcutImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Advisor advisor=new DefaultPointcutAdvisor(p,sb);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AffairAroundAdvice ad=new AffairAroundAdvice();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.addAdvisor(advisor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.addAdvice(ad);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.setTarget(bi);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Business b=(Business) pf.getProxy();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.business1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.business2();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
开发步骤:<br />
1.写核心业务类<br />
2.写系统服务类(advice)<br />
3.选择性的写过滤类(pointcut)<br />
4.写客户代码:通过DefaultPointcutAdvisor将advice and pointcut组装,代理工厂添加advice,设置目标对象,生成代理对象,代理对象调用业务方法<br />
&nbsp;<br />
使用proxyfactorybean方式:<br />
添加配置文件:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;businessimpl&quot; class=&quot;yuchen.aop.updatefirstaop.BusinessImpl&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;secuity&quot; class=&quot;yuchen.aop.updatefirstaop.SecuityBeforeAdvice&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;affair&quot; class=&quot;yuchen.aop.updatefirstaop.AffairAroundAdvice&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;pointcutimpl&quot; class=&quot;yuchen.aop.updatefirstaop.PointcutImpl&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;befadvisor&quot; class=&quot;org.springframework.aop.support.DefaultPointcutAdvisor&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;advice&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;secuity&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;pointcut&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;pointcutimpl&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;factory&quot; class=&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;target&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;businessimpl&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;interceptorNames&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;befadvisor&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;affair&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
&nbsp;<br />
修改Test:<br />
package yuchen.aop.updatefirstaop;<br />
&nbsp;<br />
import org.springframework.aop.Advisor;<br />
import org.springframework.aop.Pointcut;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
import org.springframework.aop.support.DefaultPointcutAdvisor;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new ClassPathXmlApplicationContext(&quot;yuchen/aop/updatefirstaop/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Business b=(Business) context.getBean(&quot;factory&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
前置Advice:<br />
接口:<br />
package yuchen.aop.before.proxyfactory;<br />
&nbsp;<br />
public interface Business {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void busMethod2();<br />
}<br />
&nbsp;<br />
&nbsp;<br />
核心业务实现类:<br />
package yuchen.aop.before.proxyfactory;<br />
&nbsp;<br />
public class BusinessImpl implements Business {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void busMethod1(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.business1();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void busMethod2(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.business2();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void business1() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;核心业务方法1&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void business2() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;核心业务方法2&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
实体类:<br />
package yuchen.aop.before.proxyfactory;<br />
&nbsp;<br />
public class UserInfo {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String username;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String password;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public UserInfo() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public UserInfo(String username, String password) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getPassword() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return password;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setPassword(String password) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getUsername() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return username;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setUsername(String username) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
&nbsp;<br />
用户登陆管理类:<br />
package yuchen.aop.before.proxyfactory;<br />
&nbsp;<br />
public class UserMagager {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private static ThreadLocal t=new ThreadLocal();<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void login(String username,String password){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.set(new UserInfo(username,password));<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void logout(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.set(null);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static UserInfo getUserInfo(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (UserInfo)t.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void validate(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserInfo user=getUserInfo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(user==null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new UserInfoException(&quot;您还没有登陆&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if(user.getUsername().equals(&quot;admin&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;系统管理员登陆&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new UserInfoException(&quot;您不是系统管理员&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
自定义异常:<br />
package yuchen.aop.before.proxyfactory;<br />
&nbsp;<br />
public class UserInfoException extends RuntimeException {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public UserInfoException(String msg){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(msg);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
&nbsp;<br />
前置advice:<br />
package yuchen.aop.before.proxyfactory;<br />
&nbsp;<br />
import java.lang.reflect.Method;<br />
&nbsp;<br />
import org.springframework.aop.MethodBeforeAdvice;<br />
&nbsp;<br />
public class SecuityBeforeAdvice implements MethodBeforeAdvice{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.validate();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
Test:<br />
package yuchen.aop.before.proxyfactory;<br />
/*<br />
&nbsp;* 当抛出异常的时候,拦截器中断<br />
&nbsp;*/<br />
import org.springframework.aop.framework.ProxyFactory;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Business bi=getProxyFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bi.busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(UserInfoException ue){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ue.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.login(&quot;admin&quot;, &quot;1234&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bi.busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.logout();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.login(&quot;yuchen&quot;, &quot;123&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bi.busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(UserInfoException ue){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ue.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public static Business getProxyFactory(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyFactory pf=new ProxyFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Business business=new BusinessImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SecuityBeforeAdvice sa=new SecuityBeforeAdvice();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.setTarget(business);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.addAdvice(sa);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Business)pf.getProxy();<br />
&nbsp;&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
&nbsp;<br />
采用声明服务方式:<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;businessimpl&quot; class=&quot;yuchen.aop.before.proxyfactorybean.BusinessImpl&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;secuity&quot; class=&quot;yuchen.aop.before.proxyfactorybean.SecuityBeforeAdvice&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;factory&quot; class=&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;target&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;businessimpl&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;interceptorNames&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;secuity&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
修改Test:<br />
package yuchen.aop.before.proxyfactorybean;<br />
/*<br />
&nbsp;* 当抛出异常的时候,拦截器中断<br />
&nbsp;*/<br />
import org.springframework.aop.framework.ProxyFactory;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new ClassPathXmlApplicationContext(&quot;yuchen/aop/before/proxyfactorybean/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Business business=(Business) context.getBean(&quot;factory&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.login(&quot;admin&quot;, &quot;123&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; business.busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; business.busMethod2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.logout();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.login(&quot;yuchen&quot;, &quot;1&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; business.busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(UserInfoException ue){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ue.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMagager.logout();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; business.busMethod1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(UserInfoException ue){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ue.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
后置Advice:<br />
实体类:<br />
package yuchen.aop.after.proxyfactory;<br />
/*<br />
&nbsp;* 业务类<br />
&nbsp;*/<br />
public class Man {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private int age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public Man() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Man(String name, int age) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.age = age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public int getAge() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setAge(int age) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.age = age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public Man growup(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
核心业务类:<br />
package yuchen.aop.after.proxyfactory;<br />
/**<br />
&nbsp;* 服务:方法计数器<br />
&nbsp;*/<br />
import java.lang.reflect.Method;<br />
import java.util.HashMap;<br />
import java.util.Map;<br />
&nbsp;<br />
public class Counter {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private static Map countmap=new HashMap();//存方法名和调用次数<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Map getCountmap() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return countmap;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setCountmap(Map countmap) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.countmap = countmap;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void count(Method method){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count(method.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; //计算方法调用的次数并保存到一个map表中<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void count(String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer i=(Integer) countmap.get(&quot;name&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countmap.put(name, new Integer(i.intValue()+1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countmap.put(name, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; //返回方法调用的次数<br />
&nbsp;&nbsp;&nbsp;&nbsp; public int getCount(String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer i=(Integer) countmap.get(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i==null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=i.intValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
后置advice:<br />
package yuchen.aop.after.proxyfactory;<br />
&nbsp;<br />
import java.lang.reflect.Method;<br />
&nbsp;<br />
import org.springframework.aop.AfterReturningAdvice;<br />
&nbsp;<br />
public class CountAgeAfterAdvice extends Counter implements AfterReturningAdvice{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void afterReturning(Object returnvalue, Method method, Object[] parameter, Object target) throws Throwable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //returnvalue:被拦截的方法的返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //method:被拦截的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //parameter:被拦截的方法的参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //target:被拦截的目标对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.count(method);//被拦截的对象的方法调用后执行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(method.getName().equals(&quot;growup&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Man man=(Man)returnvalue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(man.getName()+&quot;:&quot;+man.getAge());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(this.getCount(method.getName()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
Test:<br />
package yuchen.aop.after.proxyfactory;<br />
&nbsp;<br />
import org.aopalliance.aop.Advice;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Man man=new Man(&quot;yuchen&quot;,24);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CountAgeAfterAdvice counter=new CountAgeAfterAdvice();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyFactory pf=new ProxyFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.addAdvice(counter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.setTarget(man);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Man m=(Man) pf.getProxy();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.growup();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
声明式:xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;man&quot; class=&quot;yuchen.aop.after.proxyfactorybean.Man&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;name&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;age&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;24&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;counterage&quot; class=&quot;yuchen.aop.after.proxyfactorybean.CountAgeAfterAdvice&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;factory&quot; class=&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;target&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;man&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;interceptorNames&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;counterage&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
修改Test:<br />
package yuchen.aop.after.proxyfactorybean;<br />
&nbsp;<br />
import org.aopalliance.aop.Advice;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new ClassPathXmlApplicationContext(&quot;yuchen/aop/after/proxyfactorybean/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Man man=(Man) context.getBean(&quot;factory&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(man.getName()+&quot;:&quot;+man.getAge());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; man.growup();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
环绕Advice:<br />
业务核心类:<br />
package yuchen.aop.interception.proxyfactory;<br />
&nbsp;<br />
public class AccountWork {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void account(int num){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;num;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; work();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void work(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;工作中....&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
环绕advice:<br />
package yuchen.aop.interception.proxyfactory;<br />
&nbsp;<br />
import java.lang.reflect.Method;<br />
&nbsp;<br />
import org.aopalliance.intercept.MethodInterceptor;<br />
import org.aopalliance.intercept.MethodInvocation;<br />
import org.springframework.util.StopWatch;<br />
&nbsp;<br />
public class AccountCapabilityAdvice implements MethodInterceptor{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object invoke(MethodInvocation invocation) throws Throwable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StopWatch sw=new StopWatch();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.start(invocation.getMethod().getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object obj=invocation.proceed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.stop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.displaybulletin(invocation, sw.getTotalTimeMillis());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; private void displaybulletin(MethodInvocation invocation,long l){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m=invocation.getMethod();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object obj=invocation.getThis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] arg=invocation.getArguments();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;目标类:&quot;+obj.getClass().getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;方法:&quot;+m.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(&quot;方法参数:&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;arg.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(arg[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i!=arg.length-1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;,&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;性能测试时间:&quot;+l);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
Test:<br />
package yuchen.aop.interception.proxyfactory;<br />
&nbsp;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccountWork aa=getproxyfactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aa.account(100);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private static AccountWork getproxyfactory(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyFactory pf=new ProxyFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccountWork aw=new AccountWork();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccountCapabilityAdvice aca=new AccountCapabilityAdvice();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.setTarget(aw);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.addAdvice(aca);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (AccountWork)pf.getProxy();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
声明方式:<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;account&quot; class=&quot;yuchen.aop.interception.proxyfactorybean.AccountWork&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;acadvice&quot; class=&quot;yuchen.aop.interception.proxyfactorybean.AccountCapabilityAdvice&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;factory&quot; class=&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;target&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;account&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;interceptorNames&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;acadvice&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
修改Test:<br />
package yuchen.aop.interception.proxyfactorybean;<br />
&nbsp;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new ClassPathXmlApplicationContext(&quot;yuchen/aop/interception/proxyfactorybean/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccountWork aw=(AccountWork) context.getBean(&quot;factory&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aw.account(100);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
异常抛出Advice:<br />
业务核心类:<br />
package yuchen.aop.exception.proxyfactory;<br />
&nbsp;<br />
import java.rmi.RemoteException;<br />
&nbsp;<br />
public class ExceptionBean {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void exception1() throws RemoteException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RemoteException(&quot;远程方法调用异常&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
异常抛出advice:<br />
package yuchen.aop.exception.proxyfactory;<br />
&nbsp;<br />
import java.lang.reflect.Method;<br />
import java.rmi.RemoteException;<br />
&nbsp;<br />
import org.springframework.aop.ThrowsAdvice;<br />
&nbsp;<br />
public class ExceptionAdvice implements ThrowsAdvice{<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void afterThrowing(Method method,Object[] args,Object target,RemoteException re){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;抛出异常的方法名:&quot;+method);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;目标对象:&quot;+target.getClass().getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;异常信息:&quot;+re.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
Test:<br />
package yuchen.aop.exception.proxyfactory;<br />
&nbsp;<br />
import java.rmi.RemoteException;<br />
&nbsp;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExceptionBean bean=getProxyFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bean.exception1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (RemoteException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static ExceptionBean getProxyFactory(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyFactory pf=new ProxyFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExceptionBean eb=new ExceptionBean();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExceptionAdvice ea=new ExceptionAdvice();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.setTarget(eb);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf.addAdvice(ea);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (ExceptionBean)pf.getProxy();<br />
&nbsp;&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
声明式方式:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;bean&quot; class=&quot;yuchen.aop.exception.proxyfactorybean.ExceptionBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;advice&quot; class=&quot;yuchen.aop.exception.proxyfactorybean.ExceptionAdvice&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;factory&quot; class=&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;target&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;bean&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;interceptorNames&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;advice&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
修改Test:<br />
package yuchen.aop.exception.proxyfactorybean;<br />
&nbsp;<br />
import java.rmi.RemoteException;<br />
&nbsp;<br />
import org.springframework.aop.framework.ProxyFactory;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext context=new ClassPathXmlApplicationContext(&quot;yuchen/aop/exception/proxyfactorybean/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExceptionBean bean=(ExceptionBean) context.getBean(&quot;factory&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bean.exception1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (RemoteException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-07-23 02:02:21.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring 基础教程(二)]]></title>
		<link>http://www.javawind.net/5b016f381b4725ef011b4bed16370077.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>依赖注入的三种方式:<br />
1.基于接口注入<br />
2.构造方法注入<br />
3.set注入<br />
&nbsp;<br />
基于接口注入:<br />
只要实现制定的接口,那么便创建对象,类似于标示接口,比如说:servlet的pagecontext等,只要实现了servlet接口,那么pagecontext,request,response,ServletContext等就会创建<br />
&nbsp;<br />
构造方法注入:<br />
顾名思义,通过构造方法注入对象的属性,这种方式不常用<br />
&nbsp;<br />
Set注入:<br />
通过set方法注入对象信息,这个用的最多<br />
&nbsp;<br />
ApplicationContext:<br />
通常使用ClassPathXmlApplicationContext这个类来代替XmlBeanFactory<br />
&nbsp;<br />
FileResource:<br />
得到资源文件(xml)的另一种方式:绝对路径方式,一般使用的不多<br />
&nbsp;<br />
综合例子(依赖注入and ClassPathXmlApplicationContext):<br />
程序目标:测试构造方法注入和set注入<br />
Model接口:<br />
package yuchen.immit.constructimmit;<br />
&nbsp;<br />
public interface Model {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String supportData();<br />
}<br />
&nbsp;<br />
view接口:<br />
package yuchen.immit.constructimmit;<br />
&nbsp;<br />
public interface View {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void render();<br />
}<br />
&nbsp;<br />
ModelImp实现类:<br />
package yuchen.immit.constructimmit;<br />
&nbsp;<br />
public class ModelImp implements Model {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; //set注入<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String ownerName;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private double balance;<br />
&nbsp;&nbsp;&nbsp;&nbsp; //构造方法注入<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String city;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public ModelImp(String city){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.city=city;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String supportData() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;model : \n&quot;+&quot;ownerName :&quot;+this.ownerName+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;\n balance :&quot;+this.balance+&quot;\n city:&quot;+city;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public double getBalance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return balance;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setBalance(double balance) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.balance = balance;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getOwnerName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ownerName;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setOwnerName(String ownerName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ownerName = ownerName;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
ViewImp:<br />
package yuchen.immit.constructimmit;<br />
&nbsp;<br />
public class ViewImp implements View {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Model model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Model model2;//构造方法注入<br />
&nbsp;&nbsp;&nbsp;&nbsp; public ViewImp(Model model2){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.model2=model2;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void render() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rst=model2.supportData();构造注入的ModelImp对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rst=model.supportData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rst);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Model getModel() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setModel(Model model) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.model = model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
beans.xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; <br />
&quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;model&quot; class=&quot;yuchen.immit.constructimmit.ModelImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;北京&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;ownerName&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;balance&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;1000.67&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;view&quot; class=&quot;yuchen.immit.constructimmit.ViewImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;model&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;model&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;model&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.immit.constructimmit;<br />
&nbsp;<br />
import org.springframework.beans.factory.xml.XmlBeanFactory;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.springframework.core.io.ClassPathResource;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathResource resource=new ClassPathResource<br />
(&quot;yuchen/immit/constructimmit/beans.xml&quot;);<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlBeanFactory factory=new XmlBeanFactory(resource);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathXmlApplicationContext factory=new <br />
ClassPathXmlApplicationContext(&quot;yuchen/immit/constructimmit/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; View view=(View) factory.getBean(&quot;view&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view.render();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
Ioc依赖注入的特点:<br />
1.对spring没有依赖性,程序不依赖于spring指定的Api<br />
2.bean都是单例的,除非在bean的属性修改<br />
3.支持基本类型,引用类型和集合类型<br />
&nbsp;<br />
接口:<br />
package yuchen.ioccharacteristic;<br />
&nbsp;<br />
public interface IocCharacteristic {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
&nbsp;<br />
实现类:<br />
package yuchen.ioccharacteristic;<br />
&nbsp;<br />
import java.util.Map;<br />
&nbsp;<br />
public class IocCharacteristicImp implements IocCharacteristic {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Map map;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;display&quot;+this.map);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Map getMap() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return map;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setMap(Map map) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.map = map;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
beans.xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;ioc&quot; class=&quot;yuchen.ioccharacteristic.IocCharacteristicImp&quot; singleton=&quot;false&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;map&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key=&quot;1&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key=&quot;2&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;liu&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key=&quot;3&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;li&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.ioccharacteristic;<br />
&nbsp;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathXmlApplicationContext factory=new ClassPathXmlApplicationContext (&quot;yuchen/ioccharacteristic/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IocCharacteristic ic=(IocCharacteristic) factory.getBean(&quot;ioc&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IocCharacteristic ic2=(IocCharacteristic) factory.getBean(&quot;ioc&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //默认情况下都是单例模式,除非修改beans.xml bean 属性:singleton=&quot;false&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ic==ic2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ic.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
Bean的创建:<br />
1.工厂类创建:A.静态方法 B.new 工厂类<br />
2.XmlBeanFactory:当getBean的时候创建bean实例<br />
3.ClassPathXmlApplicationContext:当new这个对象后,就将资源中的bean读入到内存<br />
&nbsp;<br />
程序目标:<br />
一个类的属性的值通过一个工厂类的方法得到,这个工厂类有两个方法,一个是静态的,一个是成员方法,测试工厂类的使用<br />
&nbsp;<br />
接口:<br />
package yuchen.factory;<br />
&nbsp;<br />
public interface Factory {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.factory;<br />
&nbsp;<br />
public class FactoryImp implements Factory {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
工厂类:<br />
package yuchen.factory;<br />
//工厂类:一个静态,一个动态<br />
public class GetNameFactory {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static String createName(String s){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s.equals(&quot;yuchen&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;yuchen&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if(s.equals(&quot;liu&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;liu&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String newName(String s){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s.equals(&quot;yuchen&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;yuchen&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if(s.equals(&quot;liu&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;liu&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
beans.xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; <br />
&quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;fac&quot; class=&quot;yuchen.factory.FactoryImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;name&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;name&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;name1&quot; class=&quot;yuchen.factory.GetNameFactory&quot; factory-<br />
method=&quot;createName&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;getnamefactory&quot; class=&quot;yuchen.factory.GetNameFactory&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;name&quot; factory-bean=&quot;getnamefactory&quot; factory-<br />
method=&quot;newName&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;liu&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.factory;<br />
/*<br />
&nbsp;* 知识点:使用工厂类的方法,给其他类的属性设置值<br />
&nbsp;* 语法:beans.xml:静态方法:<br />
&nbsp;* &lt;bean id=&quot;getnamefactory&quot; class=&quot;yuchen.factory.GetNameFactory&quot; /&gt;<br />
&nbsp;* 成员方法:<br />
&nbsp;* &lt;bean id=&quot;name&quot; factory-bean=&quot;getnamefactory&quot; factory-method=&quot;newName&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;liu&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 使用该工厂的类:<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;name&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;name&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;*/<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String [] args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathXmlApplicationContext factory=new <br />
ClassPathXmlApplicationContext(&quot;yuchen/factory/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Factory f=(Factory) factory.getBean(&quot;fac&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
继承属性:&lt;bean Parent&gt;<br />
若干个bean,共有一个属性,使用继承<br />
A类:a,b属性已经set或通过构造方法(属性a,属性b)设置好<br />
B类:也有a,b同名属性<br />
那么在beans.xml中使用&lt;bean Parent&gt;,B 继承 A就可以了,不用在xml中从新设置<br />
&nbsp;<br />
抽象属性:&lt;bean abstract=&quot;true|false&quot;&gt;<br />
不能得到该类的实例<br />
&nbsp;<br />
自动装配bean:<br />
自动设置依赖关系:例如:A类持有B类的引用,引用属性名字和xml中的B类的id名字相同,那么会自动装配好<br />
autowire=&quot;byName|byType|constructor&quot;<br />
byName:属性&mdash;id 推荐<br />
byType:找类名匹配,存在问题,当一个类多次出现会报错<br />
constructor:根据构造方法类型匹配<br />
&nbsp;<br />
依赖检查:dependency-check=&quot;all&quot;<br />
检查所有的set方法是否都被调用了,例如:如果有属性缺少set方法,那么会报异常<br />
&nbsp;<br />
生命周期方法定制:<br />
两种方式:1.使用bean属性 2.实现接口(不推荐,框架侵入性强:依赖API)<br />
在构造方法和依赖注入set后调用init<br />
&nbsp;<br />
综合实例(继承属性, 自动装配bean, 依赖检查,生命周期方法定制):<br />
A接口:<br />
package yuchen.beansp;<br />
&nbsp;<br />
public interface A {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
B接口:<br />
package yuchen.beansp;<br />
&nbsp;<br />
public interface B {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void dispaly();<br />
}<br />
&nbsp;<br />
A实现类:<br />
package yuchen.beansp;<br />
&nbsp;<br />
public class AImp implements A {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private int age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public AImp(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public int getAge() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setAge(int age) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.age = age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Aimp: \n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(this.name+&quot;:&quot;+this.age);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
B实现类:<br />
package yuchen.beansp;<br />
&nbsp;<br />
public class BImp implements B {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private A a;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private int age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public BImp(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public int getAge() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setAge(int age) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.age = age;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void dispaly() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Bimp: \n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(this.name+&quot;:&quot;+this.age);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setA(A a) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.a = a;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void init(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;init....&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void destroy(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;destroy....&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
beans.xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;a&quot; class=&quot;yuchen.beansp.AImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;age&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;24&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;b&quot; class=&quot;yuchen.beansp.BImp&quot; autowire=&quot;byName&quot; parent=&quot;a&quot; dependency-check=&quot;all&quot; init-method=&quot;init&quot; destroy-method=&quot;destroy&quot; &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.beansp;<br />
&nbsp;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathXmlApplicationContext factory=new ClassPathXmlApplicationContext(&quot;yuchen/beansp/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B bb=(B) factory.getBean(&quot;b&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A aa=(A) factory.getBean(&quot;a&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aa.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bb.dispaly();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
获得当前bean的bean工厂对象和bean的实例名字(beans.xml中&lt;bean id=&rdquo;&rdquo;&gt;):<br />
Bean类必须实现BeanFactoryAware接口<br />
注意:不能使用依赖检查了,因为这个接口的方法不要求有set方法<br />
&nbsp;<br />
Bean类必须实现BeanNameAware接口<br />
注意:不能使用依赖检查了,因为这个接口的方法不要求有set方法<br />
&nbsp;<br />
接口:<br />
package yuchen.factoryandname;<br />
&nbsp;<br />
public interface Bird {<br />
&nbsp;<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.factoryandname;<br />
&nbsp;<br />
import org.springframework.beans.BeansException;<br />
import org.springframework.beans.factory.BeanFactory;<br />
import org.springframework.beans.factory.BeanFactoryAware;<br />
import org.springframework.beans.factory.BeanNameAware;<br />
&nbsp;<br />
public class CaiBird implements Bird ,BeanFactoryAware,BeanNameAware{<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String color;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getColor() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return color;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setColor(String color) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.color = color;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setBeanFactory(BeanFactory arg0) throws BeansException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;当前bean的bean工厂&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setBeanName(String arg0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(arg0+&quot;:&quot;+this.color);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;bird&quot; class=&quot;yuchen.factoryandname.CaiBird&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;color&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;红色&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.factoryandname;<br />
&nbsp;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathXmlApplicationContext factory=new ClassPathXmlApplicationContext (&quot;yuchen/factoryandname/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bird bb=(Bird) factory.getBean(&quot;bird&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
以上内容为bean工厂部分<br />
&nbsp;<br />
AppLicationContext<br />
基本概念:<br />
1.什么是ApplicationContext?有什么用?<br />
2.和bean工厂的区别?<br />
3.后续处理器<br />
&nbsp;<br />
什么是ApplicationContext?有什么用?<br />
是bean工厂的升级,增强了功能,例如国际化等<br />
通过这个类可以得到bean对象<br />
&nbsp;<br />
和bean工厂的区别?<br />
功能更多<br />
当实例这个对象的时候,该对象就会将资源中的bean实例存储到内存中<br />
&nbsp;<br />
后续处理器:<br />
BeanPostProcessor<br />
作用:可以在使用该实例前增加一些处理操作<br />
&nbsp;<br />
程序目标:<br />
接口:<br />
package yuchen.beanpostprocessor;<br />
&nbsp;<br />
public interface A {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display();<br />
}<br />
&nbsp;<br />
实现类:<br />
package yuchen.beanpostprocessor;<br />
&nbsp;<br />
public class AImp implements A {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public void display(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(this.name);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;<br />
后续处理器:<br />
package yuchen.beanpostprocessor;<br />
&nbsp;<br />
import org.springframework.beans.BeansException;<br />
import org.springframework.beans.factory.config.BeanPostProcessor;<br />
&nbsp;<br />
public class UpperNamePostProcessor implements BeanPostProcessor{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object postProcessAfterInitialization(Object bean, String id) throws BeansException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bean instanceof AImp){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AImp aimp=(AImp)bean;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aimp.setName(aimp.getName().toUpperCase());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bean;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return arg0;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;a&quot; class=&quot;yuchen.beanpostprocessor.AImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;name&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;yuchen&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;yuchen.beanpostprocessor.UpperNamePostProcessor&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
package yuchen.beanpostprocessor;<br />
&nbsp;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathXmlApplicationContext factory=new ClassPathXmlApplicationContext(&quot;yuchen/beanpostprocessor/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A aa=(A) factory.getBean(&quot;a&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aa.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-07-23 01:59:33.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring 基础教程(一)]]></title>
		<link>http://www.javawind.net/5b016f381b4725ef011b4be97ee70076.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>基本概念:<br />
1.什么是spring?有什么用?<br />
2.Spring和其他类似产品的区别?<br />
3.Spring的特点(优缺点)?<br />
4.Spring的内容?<br />
&nbsp;<br />
什么是spring?有什么用?<br />
Spring就是轻量级的业务层框架,什么是轻量级:第一,spring的文件大小只有1mb多,第二,资源消耗,占用内存与其他的产品相比较小(如:EJB)<br />
作用:完成业务层的开发<br />
&nbsp;<br />
Spring和其他类似产品的区别?<br />
轻量级,EJB也是完成业务层的开发,但是他是重量级的框架,EJB的重点在企业应用,那么有些程序没有必要使用重量级的工具来开发轻量级的应用,这样成本过大,spring就是满足完成轻量级应用的业务层框架<br />
&nbsp;<br />
Spring的特点(优缺点)?<br />
优点:<br />
1.依赖注入(控制反转):什么是依赖注入?在一个对象需要使用另一个对象的时候,只声明另一个对象的接口,它的实例在运行时获得它,作用:就是解决了组件中的耦合,也就是不依赖于固定的对象<br />
2.面向方面编程:什么是面向方面编程?AOP:在预编译或运行时为程序加入新的功能(如:加入安全,同步,事务等),编程方式采用的是注释,不用在业务代码中写这些与业务无关的代码了,作用:实现业务与其他代码分离,解耦合,他完善依赖注入(DI)<br />
3.简化javaee编程结构:对web的支持(MVC),DAO的支持,ORM的支持<br />
4.类似一站式服务:web,业务的功能都有,用户也可以选择性的使用<br />
&nbsp;<br />
Spring的内容?<br />
1.核心模块:BeanFactory(用来管理bean组件的,相当于bean的容器,通过独bean的xml文件,可以从中知道bean与bean的依赖关系和bean的实现)<br />
2.AOP:面向方面编程(声明式中间件服务管理)<br />
3.ORM<br />
4.DAO<br />
5.Web<br />
6.Context:ApplicationContext:作用:增强功能,如:程序国际化等<br />
&nbsp;<br />
第一个Spring:<br />
1.下载spring框架<br />
2.解读spring框架的目录结构<br />
3.实例1(不使用工具)<br />
4.实例2(eclipse)<br />
5.杂项问题<br />
&nbsp;<br />
下载spring框架:<br />
<a href="http://www.springframework.org">http://www.springframework.org</a><br />
本地: E:\个人数据库\基本结构\专业\spring\参考资料\Spring-framework.zip<br />
&nbsp;<br />
解读spring框架的目录结构:<br />
解压下载的spring框架:<br />
/dist:核心包,spring.jar(工厂文件集合),还有spring.jar的子包,spring-beans.dtd:定义beans.xml的属性和beans.xml的头部<br />
/docs:spring api文档<br />
/lib:spring的编译和运行所依赖的第三方类库<br />
&nbsp;<br />
实例1(不使用工具):<br />
程序目标:开发一个spring,功能是显示hello 方法参数 my name is bean属性value<br />
1.设置classpath:添加spring.jar and \lib\jakarta-commons\commons-logging.jar<br />
2.创建一个应用目录:yuchen<br />
3.创建src目录<br />
4.开发一个接口和一个类<br />
5.写配置文件beans.xml:定义这个类,文件的头部可以去spring-beans.dtd中找到<br />
6.写客户端测试类<br />
7.编译运行<br />
&nbsp;<br />
接口:<br />
package first;<br />
&nbsp;<br />
public interface Hello{<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String sayhello(String user);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
Bean:<br />
package first;<br />
&nbsp;<br />
public class HelloImp implements Hello{<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String sayhello(String user){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;hello, &quot;+user+&quot;my name is: &quot;+this.name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setName(String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name=name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
Xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot;&gt;<br />
&nbsp;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;hello&quot; class=&quot;first.HelloImp&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;name&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;spring&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
Test:<br />
import org.springframework.core.io.ClassPathResource;<br />
import org.springframework.beans.factory.xml.XmlBeanFactory;<br />
import first.*;<br />
&nbsp;<br />
public class TestHello{<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String [] args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //1.读取配置文件,beans.xml:注意beans.xml的写法:如果放到根目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下,那么直接写beans.xml,如果放到子目录下,子目录名/beans.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //2.实例化bean工厂对象,载入xml资源:工厂负责管理bean组件的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //目前是管理当前xml资源中的bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3.通过bean工厂对象得到你要找的bean实例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathResource resource=new ClassPathResource(&quot;beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlBeanFactory factory=new XmlBeanFactory(resource);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hello hello=(Hello)factory.getBean(&quot;hello&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rst=hello.sayhello(&quot;yuchen&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rst);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
D:\yuchen&gt; Javac &ndash;d d:\yuchen d:\yuchen\src\*.java<br />
D:\yuchen&gt; Javac &ndash;d d:\yuchen d:\yuchen\*.java<br />
D:\yuchen&gt; java TestHello<br />
&nbsp;<br />
实例2(eclipse):<br />
程序目标:测试spring的特性:依赖注入/控制反转,调用A类的业务方法,这个方法需要B类方法提供的数据,在A类中,没有B实例,只有B的接口类型,只依赖它的接口,在运行时获得B的实例,从而得到其数据<br />
1.新建java工程<br />
2.配置jar:两个包<br />
3.开发两个接口,两个类<br />
4.写beans.xml<br />
5.测试类测试<br />
Model接口:<br />
package yuchen.beanfactory;<br />
&nbsp;<br />
public interface Model {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String supportData();<br />
}<br />
&nbsp;<br />
View接口:<br />
package yuchen.beanfactory;<br />
&nbsp;<br />
public interface View {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void render();<br />
}<br />
&nbsp;<br />
Model bean:<br />
package yuchen.beanfactory;<br />
&nbsp;<br />
public class AcountModel implements Model {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private String ownerName;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private double balance;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String supportData() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;Acdount : \n&quot;+&quot;ownerName :&quot;+this.ownerName+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;\n balance :&quot;+this.balance;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setBalance(double balance) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.balance = balance;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setOwnerName(String ownerName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ownerName = ownerName;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
View bean:<br />
package yuchen.beanfactory;<br />
&nbsp;<br />
public class CommandLineView implements View {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Model model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void render() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rst=model.supportData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rst);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setModel(Model model) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.model = model;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;<br />
beans.xml:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>&quot; &gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;model&quot; class=&quot;yuchen.beanfactory.AcountModel&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;ownerName&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;tarena&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;balance&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;1000.56&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;view&quot; class=&quot;yuchen.beanfactory.CommandLineView&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;model&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;model&quot;&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
&nbsp;<br />
test:<br />
package yuchen.beanfactory;<br />
&nbsp;<br />
import org.springframework.beans.factory.xml.XmlBeanFactory;<br />
import org.springframework.core.io.ClassPathResource;<br />
&nbsp;<br />
public class Test {<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathResource resource=new ClassPathResource(&quot;yuchen/beanfactory/beans.xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlBeanFactory factory=new XmlBeanFactory(resource);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; View view=(View) factory.getBean(&quot;view&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view.render();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
&nbsp;<br />
杂项问题:<br />
1.在eclipse中引入xml dtd文件<br />
Windows-&gt;preferences-&gt;web and xml -&gt; xml catalog<br />
Add:uri:要导入的dtd地址如:spring-beans.dtd<br />
Key type:public id<br />
Key:例如:-//spring//dtd//en<br />
&nbsp;<br />
2.导入log4j<br />
导入:spring/lib/log4j.jar<br />
在根目录下创建log4j.properties文件,内容从H:\spring-framework-1.2.8\test\<br />
log4j.properties里面拷贝<br />
解决了运行中显示红色的log信息的问题</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-07-23 01:55:38.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring Framework 2.5 Reference中文版正式发布]]></title>
		<link>http://www.javawind.net/5b016f381b1a4c70011b1b75ce3d002c.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p><strong>声明</strong> <br />
Spring中文参考手册得到Spring Framework开发团队的直接授权和大力的支持，其目的是在中文世界推广优秀的开源技术。本次翻译活动由满江红开放技术研究组织(<a title="http://www.redsaga.com" target="_blank" href="http://www.redsaga.com/">http://www.redsaga.com</a> )和Spring中文论坛(<a title="http://spring.jactiongroup.net" target="_blank" href="http://spring.jactiongroup.net/">http://spring.jactiongroup.net</a> ) 共同发起、组织。我们在此郑重宣布，本次翻译遵循原Spring Framework的授权协议，即Apache 2.0协议。在完整保留全部文本(包括本版权页)，并且不违反Apache 2.0协议的前提下，允许和鼓励任何人进行全文转载及推广，所有参与人员放弃除署名权外的一切权利。 <br />
<br />
<strong>致谢</strong> <br />
如此庞大的项目不是一两个组织可以独立完成的，就像Spring本身一样，涵盖了Java技术的方方面面。因为有了大家的关心和支持才使此次项目能够顺利完成。有理由相信，中文开源世界必将在不久的将来展现出更广阔的发展空间，希望大家都能为推动中国软件发展奉献出自己的一份力量。 <br />
<br />
<strong>项目主页：</strong> <br />
<a title="http://wiki.redsaga.com/confluence/display/Spring2/Spring2.5" target="_blank" href="http://wiki.redsaga.com/confluence/display/Spring2/Spring2.5">http://wiki.redsaga.com/confluence/display/Spring2/Spring2.5</a> <br />
<strong>勘误表：</strong> <br />
<a title="http://wiki.redsaga.com/confluence/pages/viewpage.action?pageId=3171" target="_blank" href="http://wiki.redsaga.com/confluence/pages/viewpage.action?pageId=3171">http://wiki.redsaga.com/confluence/pages/viewpage.action?pageId=3171</a></p>
<p>在线版本：<span class="nobr"><a title="Visit page outside Confluence" rel="nofollow" href="http://www.redsaga.com/spring_ref/2.5/html/">HTML</a></span> / <span class="nobr"><a title="Visit page outside Confluence" rel="nofollow" href="http://www.redsaga.com/spring_ref/2.5/html_single/">HTML Single</a></span></p>
<p>下载地址：<span class="nobr"><a title="Visit page outside Confluence" rel="nofollow" href="http://www.redsaga.com/spring_ref/2.5/spring-reference.pdf">PDF(593页，4.41MB)</a></span> / <span class="nobr"><a title="Visit page outside Confluence" rel="nofollow" href="http://www.redsaga.com/spring_ref/2.5/Spring-Reference_zh_CN.chm">CHM(2.08MB)</a></span></p>
<p>勘误表：<a title="勘误表(Spring 2.5)" href="http://wiki.redsaga.com/confluence/pages/viewpage.action?pageId=3171">勘误表(Spring 2.5) </a></p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-07-13 16:07:30.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Spring Configuration电子书]]></title>
		<link>http://www.javawind.net/5b016f381a9e3f16011a9f9fcb460008.jhtml</link>
		<author>amen</author>  
		<description><![CDATA[<p>Spring Configuration是一本专门介绍Spring配置文件的好书，希望对大家有用！！<br />
<a title="点击下载附件" target="_blank" href="Upload/2008-06/19_0257_71F9927.pdf"><img alt="下载附件" border="0" src="http://www.javawind.net/images/filetype/pdf.gif" /> 19_0257_71F9927.pdf</a><br />
&nbsp;</p>]]></description>
		<category><![CDATA[12]]></category>
		<pubDate>2008-06-19 15:00:27.0</pubDate> 
	</item>
		
	</channel>
</rss>