﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-闲人野居-随笔分类-spring</title><link>http://www.blogjava.net/zyl/category/17749.html</link><description>好好学习，天天向上</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:37:30 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:37:30 GMT</pubDate><ttl>60</ttl><item><title>关于spring 2.0自定义xml 标记 （二 如何实现）</title><link>http://www.blogjava.net/zyl/archive/2006/10/27/77708.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Fri, 27 Oct 2006 10:18:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2006/10/27/77708.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/77708.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2006/10/27/77708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/77708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/77708.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 看了spring test 用例，其实实现这一功能还算比较简单，主要分以下的步骤，具体的实例可以去参考spring 自带的testcase首先定义相关xsd文件，用于验证相应的行为：  主要增加了4个自定义元素和1个属性：&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;    &lt;xsd:schema xmlns="htt...&nbsp;&nbsp;<a href='http://www.blogjava.net/zyl/archive/2006/10/27/77708.html'>阅读全文</a><img src ="http://www.blogjava.net/zyl/aggbug/77708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2006-10-27 18:18 <a href="http://www.blogjava.net/zyl/archive/2006/10/27/77708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于spring 2.0自定义xml 标记 （一 主要的相关类）</title><link>http://www.blogjava.net/zyl/archive/2006/10/27/77707.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Fri, 27 Oct 2006 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2006/10/27/77707.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/77707.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2006/10/27/77707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/77707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/77707.html</trackback:ping><description><![CDATA[  在spring 2.0 中，增加了自定义xml标记这一重大的功能。下面主要看一下spring 2.0实现这一功能的主要相关类：<br /><br /> <b>NamespaceHandlerResolver（接口）</b><br />    由DefaultBeanDefinitionDocumentReader使用，用于定位NamespaceHandler，指定特定的命名空间uri<br /><br />   实现类：<br />   <b>DefaultNamespaceHandlerResolver</b><br />   <br />   通过map 保存所有的对应关系<br />   默认使用spring.handlers文件来保存所有的handlers<br />   可以定义其他的location 如：<br /><br />   String location = "org/springframework/beans/factory/xml/support/customNamespace.properties";<br />   NamespaceHandlerResolver resolver = new DefaultNamespaceHandlerResolver(getClass().getClassLoader(), location);<br />   <br />  <b> NamespaceHandler（接口）<br />    <br /></b>      基础接口，用于DefaultBeanDefinitionDocumentReader处理自定义命名空间。<br />      方法：<br />         void init();<br />         由DefaultBeanDefinitionDocumentReader调用在构造完后但在解析自定义元素前。<br />  <br />         BeanDefinition parse(Element element, ParserContext parserContext);<br />         解析指定的元素。<br />  <br />         BeanDefinitionHolder decorate(Node element, <br />                                    BeanDefinitionHolder definition, <br />                                    ParserContext parserContext);<br />         执行相应的修饰。<br /><br />   实现类：<br />     <br />     <b>NamespaceHandlerSupport（抽象类）</b><br />   <br />   主要的三个方法：<br />   protected final void registerBeanDefinitionDecorator(<br />                         String elementName, <br />                         BeanDefinitionDecorator decorator)<br />   注册decorator，通过element<br />  <br />   protected final void registerBeanDefinitionDecoratorForAttribute(<br />                          String attributeName, <br />                          BeanDefinitionDecorator decorator)<br />    注册decorator，通过attr<br />   <br />    protected final void registerBeanDefinitionParser(<br />                          String  elementName, <br />                          BeanDefinitionParser parser)<br />    注册BeanDefinitionParser，通过element<br /><br />   实际的操作由具体的BeanDefinitionDecorator 或者BeanDefinitionParser 执行<br /><br />  <b>BeanDefinitionDecorator(接口)</b><br /><br />   装饰相关的自定义属性。<br /><br />     AbstractInterceptorDrivenBeanDefinitionDecorator<br />          用于注册相应的Interceptor bean 定义，使用aop代理<br /><br />  <b>其他类：<br /><br /></b>    PluggableSchemaResolver，用于自定义相关的schema,默认的schema 保存于spring.schemas文件中<br /><br />    可以通过覆盖resolveEntity方法来装载相应的自定义xsd文件<br /><br /><b>  主要的执行类：<br />  </b><br />  XmlBeanDefinitionReader<br />  <br />    用于处理相应的读取工作，其实主要的工作委派给BeanDefinitionDocumentReader<br /><br /><br />  实际的类，就介绍到这，下一节通过实例来说明如何定义自定义xml 元素<br /><b><br /></b><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/zyl/aggbug/77707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2006-10-27 18:08 <a href="http://www.blogjava.net/zyl/archive/2006/10/27/77707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 2.0 关于事务的变化（主要为声明性事务）</title><link>http://www.blogjava.net/zyl/archive/2006/09/18/70364.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Mon, 18 Sep 2006 12:13:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2006/09/18/70364.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/70364.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2006/09/18/70364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/70364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/70364.html</trackback:ping><description><![CDATA[
		<p>在 1.x中，spring 的事务声明，一直是采用动态代理bean 实现的，也就是采用<span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US">ProxyFactoryBean或者子类<span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US"><span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US">TransactionProxyFactoryBean来实现的<br /><br />考虑下面的例子：(用1.x实现）<br /><span lang="EN-US"><font size="3">&lt;bean id="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />    &lt;property name="sessionFactory" ref="mySessionFactory"/&gt;<br />  &lt;/bean&gt;<br /><br />  &lt;bean id="myProductService" class="<font color="#ff0000">org.springframework.aop.framework.ProxyFactoryBean</font>"&gt;<br />    &lt;property name="proxyInterfaces" value="product.ProductService"/&gt;<br />    &lt;property name="target"&gt;<br />        &lt;bean class="product.DefaultProductService"&gt;<br />            &lt;property name="productDao" ref="myProductDao"/&gt;<br />        &lt;/bean&gt;<br />    &lt;/property&gt;<br />    &lt;property name="interceptorNames"&gt;<br />      &lt;list&gt;<br />        &lt;value&gt;<font color="#ff0000">myTxInterceptor</font>&lt;/value&gt; <i class="lineannotation"><span class="lineannotation">&lt;!-- the transaction interceptor (configured elsewhere) --&gt;</span></i><br />      &lt;/list&gt;<br />    &lt;/property&gt;<br />  &lt;/bean&gt;<br /></font></span></span></span></span></p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="3"> &lt;bean id="<font color="#ff0000">myTxInterceptor</font>"</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">class="org.springframework.transaction.interceptor.TransactionInterceptor"&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">&lt;property name="transactionManager"&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">   &lt;ref bean="myTransactionManager"/&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">&lt;/property&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">&lt;property name="transactionAttributeSource"&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">  &lt;value&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">   product.ProductService.increasePrice*=PROPAGATION_REQUIRED</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">  product.ProductService.someOtherBusinessMethod=PROPAGATION_MANDATORY</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">  &lt;/value&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<font size="3">&lt;/property&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="3">&lt;/bean&gt;</font>
				</span>
		</p>
		<p>或者<br /></p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">&lt;bean id="myProductService"</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 10.5pt;">
				<span lang="EN-US">class="<font color="#ff0000">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</font>"&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;property name="transactionManager"&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 63pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;ref bean="myTransactionManager"/&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;/property&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;property name="target"&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 63pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;ref bean="myProductServiceTarget"/&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;/property&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 63pt;">
				<span lang="EN-US">&lt;property name="transactionAttributes"&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 63pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;props&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 84pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;prop key="increasePrice*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 136.5pt; text-indent: -31.5pt;">
				<span lang="EN-US">&lt;prop key="someOtherBusinessMethod"&gt;PROPAGATION_MANDATORY&lt;/prop&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 63pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;/props&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt;">
				<span lang="EN-US">&lt;/property&gt;<br /></span>
				<span lang="EN-US">&lt;/bean&gt;</span>
				<br />
				<br />
				<span lang="EN-US">当然，这需要每个服务接口都要声明一个事务bean ，这比较麻烦，当然，spring 也提供了另外一种解决方案<br /><br />采用<span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US">BeanNameAutoProxyCreator <span style="font-size: 10.5pt; font-family: 宋体;">自动代理声明入口来全局声明所有的事务。<br /><span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US">&lt;bean id="matchAllWithPropReq"<br />         class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource"&gt;<br />         &lt;property name="transactionAttribute"&gt;&lt;value&gt;PROPAGATION_REQUIRED&lt;/value&gt;&lt;/property&gt;<br />&lt;/bean&gt;<br /><br />&lt;bean id="matchAllTxInterceptor"<br />         class="org.springframework.transaction.interceptor.TransactionInterceptor"&gt;<br />         &lt;property name="transactionManager"&gt;&lt;ref bean="transactionManager"/&gt;&lt;/property&gt;<br />         &lt;property name="transactionAttributeSource"&gt;&lt;ref bean="matchAllWithPropReq"/&gt;&lt;/property&gt;<br />&lt;/bean&gt;<br /></span></span></span><span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US"><font color="#ff0000">&lt;bean id="autoProxyCreator"<br />         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt;<br /></font>         &lt;property name="interceptorNames"&gt;<br />            &lt;list&gt;<br />               &lt;idref local="matchAllTxInterceptor"/&gt;<br />               &lt;idref bean="hibInterceptor"/&gt;<br />            &lt;/list&gt;<br />         &lt;/property&gt;<br />         &lt;property name="beanNames"&gt;<br />            &lt;list&gt;<br /><font color="#ff0000">               &lt;idref local="core-services-applicationControllerSevice"/&gt;<br />               &lt;idref local="core-services-deviceService"/&gt;<br />               &lt;idref local="core-services-authenticationService"/&gt;<br />               &lt;idref local="core-services-packagingMessageHandler"/&gt;<br />               &lt;idref local="core-services-sendEmail"/&gt;<br />               &lt;idref local="core-services-userService"/&gt;</font><br />            &lt;/list&gt;<br />         &lt;/property&gt;<br />&lt;/bean&gt;<br />list中包含了所有需要实现事务的服务bean <br /><br /> spring 2.0带来的aop变化和bean xml schema的变化，使得事务的处理变得更加的简单,</span></span>同aop一样，事务也采用两种方式来处理，一种主要为xml 声明，另外的一种也就是注释的引入。<br />先来看第一种情况：<br />&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />     <font color="#ff0000">  xmlns:aop="http://www.springframework.org/schema/aop"<br />       xmlns:tx="http://www.springframework.org/schema/tx"<br /></font>       xsi:schemaLocation="<br />       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd<br />       <font color="#ff0000">http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd<br />       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd</font>"&gt;<br /><br />  <i class="lineannotation"><span class="lineannotation">&lt;!-- <tt class="interfacename">SessionFactory</tt>, <tt class="interfacename">DataSource</tt>, etc. omitted --&gt;</span></i><br /><br />  &lt;bean id="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />    &lt;property name="sessionFactory" ref="mySessionFactory"/&gt;<br />  &lt;/bean&gt;<br />  <br />  &lt;aop:config&gt;<br />   &lt;!-- 这定义了主要的切面，也就是那些接口可以使用事务,这里只是说执行<font color="#000000">ProductService的所有方法</font>--&gt;<br />  <font color="#ff0000">  &lt;aop:pointcut id="productServiceMethods" expression="execution(* product.ProductService.*(..))"/&gt;<br />    &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods"/&gt;<br /></font>  &lt;/aop:config&gt;<br />  &lt;!--主要的事务 advice 声明事务的相关属性--&gt;<br /><font color="#ff0000">  &lt;tx:advice id="txAdvice" transaction-manager="myTxManager"&gt;<br />    &lt;tx:attributes&gt;<br />      &lt;tx:method name="increasePrice*" propagation="REQUIRED"/&gt;<br />      &lt;tx:method name="someOtherBusinessMethod" propagation="REQUIRES_NEW"/&gt;<br />      &lt;tx:method name="*" propagation="SUPPORTS" read-only="true"/&gt;<br />    &lt;/tx:attributes&gt;<br />  &lt;/tx:advice&gt;<br /></font><br />  &lt;bean id="myProductService" class="product.SimpleProductService"&gt;<br />    &lt;property name="productDao" ref="myProductDao"/&gt;<br />  &lt;/bean&gt;<br /><br />&lt;/beans&gt;</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">第二种方式，使用</span>
				<span lang="EN-US">@Transactional</span>
				<span style="font-family: 宋体;">注释<br /></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">@Transactional</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">public interface FooService {</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>Foo getFoo(String fooName);</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>Foo getFoo(String fooName, String barName);</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>void insertFoo(Foo foo);</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>void updateFoo(Foo foo);</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">
						<br />xml 配置</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">&lt;!-- from the file 'context.xml' --&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">&lt;beans xmlns="http://www.springframework.org/schema/beans"</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">       </span>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">       </span>xmlns:aop="http://www.springframework.org/schema/aop"</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">       </span>xmlns:tx="http://www.springframework.org/schema/tx"</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">       </span>xsi:schemaLocation="</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">       </span>http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">       </span>http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">       </span>http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">
								<font face="Times New Roman">  </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">  </span>&lt;!-- this is the service object that we want to make transactional --&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">  </span>&lt;bean id="fooService" class="x.y.service.DefaultFooService"/&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">  </span>&lt;!-- enable the configuration of transactional behavior based on annotations --&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style=""> <font color="#ff0000"></font></span>
								<font color="#ff0000">&lt;tx:annotation-driven/&gt;</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">  </span>&lt;!-- a PlatformTransactionManager is still required --&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">  </span>&lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>&lt;!-- sourced from somewhere else --&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>&lt;property name="dataSource" ref="dataSource"/&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">  </span>&lt;/bean&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">
								<font face="Times New Roman">  </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">  </span>&lt;!-- other &lt;bean/&gt; definitions here --&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">&lt;/beans&gt;</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">public class DefaultFooService implements FooService {</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>public Foo getFoo(String fooName) {</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">        </span>// do something</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>}</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<font face="Times New Roman"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>// these settings have precedence</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style=""> <font color="#ff0000">   </font></span>
								<font color="#ff0000">@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>public void updateFoo(Foo foo) {</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">        </span>// do something</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">
								<span style="">    </span>}</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font face="Times New Roman">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
		</p>
<img src ="http://www.blogjava.net/zyl/aggbug/70364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2006-09-18 20:13 <a href="http://www.blogjava.net/zyl/archive/2006/09/18/70364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring aop 2.0 编程(三)</title><link>http://www.blogjava.net/zyl/archive/2006/09/17/70116.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Sun, 17 Sep 2006 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2006/09/17/70116.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/70116.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2006/09/17/70116.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/70116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/70116.html</trackback:ping><description><![CDATA[
		<p>前面这是讲了许多的概念，下面以一个例子来说明：<br />一个很好理解的aop 例子，也就是日志服务。<br />先从aop第一种方式来实现，也就是xml配置方式<br />先创建基本的日志类：<br />public class Logger {</p>
		<p>    private static Log log = LogFactory.getLog(Logger.class);</p>
		<p>    public void entry(String message) {<br />        log.info(message);<br />    }<br />}<br />这里只是简单的一个方法，当然实际情况可能不同。<br />由于xml配置需要一个方面的实现bean<br />所以创建一个简单的bean ：<br />public class LogBean {</p>
		<p>    private Logger logger = new Logger();</p>
		<p>    public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {<br />        logger.entry("before invoke method:"<br />                     + joinPoint.getSignature().getName());<br />        Object object = joinPoint.proceed();<br />        logger.entry("after invoke method:"<br />                     + joinPoint.getSignature().getName());<br />        return object;<br />    }<br />}<br />这里采取简单的around advice，其他类型的advice 基本上都差不多<br /><br />当然有了这两个核心的日志类，需要一个测试类，用于测试。<br />public class TestBean {</p>
		<p>    public void method1() {<br />        System.out.println("in method1");<br />    }</p>
		<p>    public void method2() {<br />        System.out.println("in method2");<br />    }<br />}<br />这就是需要测试的类了，需要记录日志的方法只有两个，这里用System.out.println，只是想显示方法的调用顺序。<br /><br /><br />然后关键的在于xml的配置了<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;beans xmlns="<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>"<br /> xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"<br /><font color="#ff0000"> xmlns:aop="</font><a href="http://www.springframework.org/schema/aop"><font color="#ff0000">http://www.springframework.org/schema/aop</font></a><font color="#ff0000">"<br /></font> xsi:schemaLocation="<br /><a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a><a href="http://www.springframework.org/schema/beans/spring-beans.xsd">http://www.springframework.org/schema/beans/spring-beans.xsd</a><br /><a href="http://www.springframework.org/schema/aop"><font color="#ff0000">http://www.springframework.org/schema/aop</font></a><font color="#ff0000"></font><a href="http://www.springframework.org/schema/aop/spring-aop.xsd"><font color="#ff0000">http://www.springframework.org/schema/aop/spring-aop.xsd</font></a><font color="#ff0000">"&gt;</font><br /> <br /> &lt;aop:config&gt;<br />    &lt;!--  <font color="#ff0000">expression 表示要执行的匹配表达式，这里匹配所有的public方法，但是去除logger类的所有方法，防止无限调用</font><font color="#000000">--&gt;<br /></font><br />      &lt;aop:pointcut id="loggableCalls"<br />         <font color="#ff0000"> expression="execution(public * *(..)) and !execution(* org.spring.test.aop.log.Logger.*(..))"/</font>&gt;<br /><br /><br />  &lt;aop:aspect id="logAspect" ref="logBean"&gt;<br />   &lt;aop:around pointcut-ref="loggableCalls" method="aroundLogCalls"/&gt;<br />  &lt;/aop:aspect&gt;<br /> <br /> &lt;/aop:config&gt;<br /> &lt;bean id="logBean" class="org.spring.test.aop.log.LogBean" /&gt;<br /> &lt;bean id="testBean" class="org.spring.test.aop.log.TestBean"/&gt;<br /> <br />&lt;/beans&gt;<br /><br />现在写一个测试类：<br /><br />public class LogXmlTest extends RootTest {</p>
		<p>    @Override<br />    protected String getBeanXml() {<br />        return "org/spring/test/aop/log/bean.xml";<br />    }</p>
		<p>    public void testLog() {<br />        TestBean bean = (TestBean) ctx.getBean("testBean");<br />        bean.method1();<br />        bean.method2();<br />    }</p>
		<p>}<br /><br />public abstract class RootTest extends TestCase {</p>
		<p>    protected ApplicationContext  ctx;</p>
		<p>    protected Log log = LogFactory.getLog(getClass());</p>
		<p>    protected RootTest() {<br />        ctx = new ClassPathXmlApplicationContext(getBeanXml());<br />    }</p>
		<p>    protected abstract String getBeanXml();</p>
		<p>}<br /><br />打印的消息如下：<br />2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - before invoke method:method1<br />in method1<br />2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - after invoke method:method1<br />2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - before invoke method:method2<br />in method2<br />2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - after invoke method:method2<br /><br />第二种实现方式，采用注释方式：<br /><br />Logger 类不变<br />创建一个LogAspect类<br />@Aspect<br />public class LogAspect {</p>
		<p>    private Logger logger = new Logger();</p>
		<p>   <font color="#ff0000"> @Pointcut("execution(public * *(..))")<br /></font>    public void publicMethods() {</p>
		<p>    }</p>
		<p>   <font color="#ff0000"> @Pointcut("execution(* org.spring.test.aop.log.Logger.*(..))")<br /></font>    public void logObjectCalls() {</p>
		<p>    }</p>
		<p> <font color="#ff0000">   @Pointcut("publicMethods()&amp;&amp;!logObjectCalls()")<br /></font>    public void loggableCalls() {</p>
		<p>    }</p>
		<p>
				<font color="#ff0000">    @Around("loggableCalls()")<br /></font>    public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {<br />        logger.entry("before invoke method:"<br />                     + joinPoint.getSignature().getName());<br />        Object object = joinPoint.proceed();<br />        logger.entry("after invoke method:"<br />                     + joinPoint.getSignature().getName());<br />        return object;<br />    }<br />}<br /><br />配置文件就简单多了<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;beans xmlns="<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>"<br /> xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"<br /> xmlns:aop="<a href="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a>"<br /> xsi:schemaLocation="<br /><a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a><a href="http://www.springframework.org/schema/beans/spring-beans.xsd">http://www.springframework.org/schema/beans/spring-beans.xsd</a><br /><a href="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a><a href="http://www.springframework.org/schema/aop/spring-aop.xsd">http://www.springframework.org/schema/aop/spring-aop.xsd</a>"&gt;<br /> <br /> &lt;aop:aspectj-autoproxy/&gt;<br /> <br /> &lt;!-- 或者使用以下定义<br /> <br /> <br /> <br /> &lt;bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /&gt;<br /> <br /> --&gt;<br /> &lt;bean id="logAspect" class="org.spring.test.aop.log.LogAspect"/&gt;<br /> &lt;bean id="testBean" class="org.spring.test.aop.log.TestBean"/&gt;<br /> <br />&lt;/beans&gt;<br /><br />测试类：<br />跟上面的差不多<br />把xml文件换掉就行<br /><br />打印的方式差不多<br /><br />个人还是比较喜欢第二种实现。</p>
<img src ="http://www.blogjava.net/zyl/aggbug/70116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2006-09-17 11:13 <a href="http://www.blogjava.net/zyl/archive/2006/09/17/70116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring aop编程(二)</title><link>http://www.blogjava.net/zyl/archive/2006/09/15/69966.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Fri, 15 Sep 2006 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2006/09/15/69966.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/69966.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2006/09/15/69966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/69966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/69966.html</trackback:ping><description><![CDATA[
		<p>前面主要介绍了如何通过xml实现aop编程，下面主要介绍如何通过@<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">AspectJ来实现。<br />为了使@<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">AspectJ 支持生效,<br />需要做以下步骤：<br /><span style="font-family: 宋体;">在</span><span lang="EN-US">xml</span><span style="font-family: 宋体;">中设置</span></span></span></p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">&lt;aop:aspectj-autoproxy/&gt;<br /><o:p></o:p></span>
		</p>
		<p>或者<br />在xml中加入<br /><span style="" lang="EN">&lt;bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /&gt;<br /><o:p><br /><a name="_Toc144432325"><span style="font-size: 12pt; line-height: 173%; font-family: 宋体;"><strong>声明</strong></span></a><span style=""><span style="font-size: 12pt; line-height: 173%;" lang="EN-US"><strong> aspect</strong></span></span><span style="font-size: 12pt; line-height: 173%;" lang="EN-US"><o:p></o:p></span></o:p></span></p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">&lt;bean id="myAspect" class="org.xyz.NotVeryUsefulAspect"&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">   </span>&lt;!-- configure properties of aspect here as normal --&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">&lt;/bean&gt;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">package org.xyz;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">import org.aspectj.lang.annotation.Aspect;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red;" lang="EN-US">@Aspect<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">public class NotVeryUsefulAspect {</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">}<br /><br /></span>
				<a name="_Toc144432326">
						<span style="font-size: 12pt; line-height: 173%; font-family: 宋体;">
								<strong>声明</strong>
						</span>
				</a>
				<span style="">
						<span style="font-size: 12pt; line-height: 173%;" lang="EN-US">
								<strong>pointcut<br /></strong>
						</span>
				</span>
				<span style="font-size: 12pt; line-height: 173%;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font color="#ff0000">@Pointcut("execution(* transfer(..))")</font>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">public void transfer() {}<br /></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<br />
				<strong>声明</strong>
				<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">
						<strong>advice<br /></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<strong>Before advice:<o:p></o:p></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public void doAccessCheck() {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<strong>After returning advice:<o:p></o:p></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@AfterReturning("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public void doAccessCheck() {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">或者</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@AfterReturning(<br />pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",<br />returning="retVal")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">public void doAccessCheck(Object retVal) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span>
						<strong>After throwing advice：<o:p></o:p></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@AfterThrowing("SystemArchitecture.dataAccessOperation()")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public void doRecoveryActions() {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">或者</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@AfterThrowing(<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>pointcut=" SystemArchitecture.dataAccessOperation()",<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>throwing="ex")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public void doRecoveryActions(DataAccessException ex) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span>
						<strong>After (finally) advice：<o:p></o:p></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public void doReleaseLock() {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span>
						<strong>Around advice：<o:p></o:p></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@Around("com.xyz.myapp.SystemArchitecture.businessService()")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public Object doBasicProfiling(</span>
				<span style="color: red; font-family: 'Courier New';" lang="EN">ProceedingJoinPoint</span>
				<span style="color: blue; font-family: 'Courier New';" lang="EN"> pjp) throws Throwable {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// start stopwatch<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>Object retVal = pjp.proceed();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>// stop stopwatch<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>return retVal;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span>
						<strong>Advice parameters：<o:p></o:p></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &amp;&amp;" + </span>
				<span style="color: red; font-family: 'Courier New';" lang="EN">"args(account,..)"</span>
				<span style="color: blue; font-family: 'Courier New';" lang="EN">)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">public void validateAccount(Account account) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<strong>
						<span style="font-family: 宋体;">声明参数名称：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@Before(<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">   </span>value="com.xyz.lib.Pointcuts.anyPublicMethod() &amp;&amp; " + <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">         </span>"@annotation(auditable)",<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>
				</span>
				<span style="color: red; font-family: 'Courier New';" lang="EN">
						<span style=""> </span>argNames="auditable"</span>
				<span style="color: blue; font-family: 'Courier New';" lang="EN">)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">public void audit(Auditable auditable) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>AuditCode code = auditable.value();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>// ...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">}<span style="">  </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span>
						<strong>Advice 排序：<o:p></o:p></strong>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">一般以声明的方法次序为先后</span>
				<span style="font-family: 'Courier New';" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">不同的</span>
				<span style="font-family: 'Courier New';" lang="EN">Advice</span>
				<span style="font-family: 宋体;">，通过实现</span>
				<span style="font-family: 'Courier New';" lang="EN">Ordered</span>
				<span style="font-family: 宋体;">接口，来排序<br /></span>
				<span style="font-family: 'Courier New';" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<a name="_Toc144432328">
						<span style="font-size: 12pt; line-height: 173%;" lang="EN-US">
								<br />
								<strong>Introductions</strong>
						</span>
				</a>
				<br />
				<span style="font-size: 12pt; line-height: 173%;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">用于引入新的接口</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">@Aspect<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">public class UsageTracking {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>
				</span>
				<span style="color: red; font-family: 'Courier New';" lang="EN">@DeclareParents(value="com.xzy.myapp.service.*+",<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red; font-family: 'Courier New';" lang="EN">
						<span style="">                  </span>defaultImpl=DefaultUsageTracked.class)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public static UsageTracked mixin;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>@Before("com.xyz.myapp.SystemArchitecture.businessService() &amp;&amp;" +<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">          </span>"this(usageTracked)")<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>public void recordUsage(UsageTracked usageTracked) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">    </span>usageTracked.incrementUseCount();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">
						<span style="">  </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue; font-family: 'Courier New';" lang="EN">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> </p>
<img src ="http://www.blogjava.net/zyl/aggbug/69966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2006-09-15 19:31 <a href="http://www.blogjava.net/zyl/archive/2006/09/15/69966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 2.0 aop编程(一)</title><link>http://www.blogjava.net/zyl/archive/2006/09/15/69805.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Fri, 15 Sep 2006 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2006/09/15/69805.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/69805.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2006/09/15/69805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/69805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/69805.html</trackback:ping><description><![CDATA[在spring2.0中，aop发生了很大的变化：<br />主要分为两大方面<br />1.支持简单的aop xml配置<br />2.支持@<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">AspectJ的注释<br /><br />先来看一看第一种情况：<br />申明一个aspect，在xml中的申明如下：<br /><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:config&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">  </span></span><span style="color: red; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="myAspect" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">    </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">  </span>&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:config&gt;<br /><br /></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;bean id="aBean" class="..."&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">  </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/bean&gt;<br /><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><o:p><br /><font color="#000000" face="Times New Roman">申明<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">pointcut<br /></span></font></o:p></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:config&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">  </span></span><span style="color: red; font-family: 'Courier New';" lang="EN">&lt;aop:pointcut id="businessService" <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">        </span>expression="execution(* com.xyz.myapp.service.*.*(..))"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:config&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br />申明<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">advice<br /></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="" lang="EN">Before advice</span></b><b style=""><span style="font-family: 宋体;">：</span></b><b style=""><span style="" lang="EN"><o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="beforeExample" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span></span><span style="color: red; font-family: 'Courier New';" lang="EN">&lt;aop:before <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">      </span>pointcut-ref="dataAccessOperation" <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">      </span>method="doAccessCheck"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="" lang="EN">After returning advice:<o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="afterReturningExample" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span></span><span style="color: red; font-family: 'Courier New';" lang="EN">&lt;aop:after-returning <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">      </span>pointcut-ref="dataAccessOperation" <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">      </span>method="doAccessCheck"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">          </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 宋体;">或者带有返回参数</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="afterReturningExample" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>&lt;aop:after-returning <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>pointcut-ref="dataAccessOperation"<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">     </span></span><span style="color: red; font-family: 'Courier New';" lang="EN"><span style=""> </span>returning="retVal" <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>method="doAccessCheck"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">          </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="" lang="EN">After throwing advice</span></b><b style=""><span style="font-family: 宋体;">：</span></b><b style=""><span style="" lang="EN"><o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="afterThrowingExample" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>&lt;aop:after-throwing<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>pointcut-ref="dataAccessOperation" <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style=""> </span><span style="">     </span>method="doRecoveryActions"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">          </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">或者带有throwing</span><span style="" lang="EN"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="afterThrowingExample" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>&lt;aop:after-throwing <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>pointcut-ref="dataAccessOperation"<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span><font color="#ff0000">throwing="dataAccessEx"</font><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>method="doRecoveryActions"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">          </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="" lang="EN">After (finally) advice</span></b><b style=""><span style="font-family: 宋体;">：</span></b><b style=""><span style="" lang="EN"><o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="afterFinallyExample" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>&lt;aop:after<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>pointcut-ref="dataAccessOperation" <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>method="doReleaseLock"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">          </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="" lang="EN">Around advice</span></b><b style=""><span style="font-family: 宋体;">：</span></b><b style=""><span style="" lang="EN"><o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="aroundExample" ref="aBean"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>&lt;aop:around<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>pointcut-ref="businessService" <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">      </span>method="doBasicProfiling"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">          </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>...<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="" lang="EN">Advice parameters</span></b><b style=""><span style="font-family: 宋体;">：</span></b><b style=""><span style="" lang="EN"><o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:before<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">  </span>pointcut="Pointcuts.anyPublicMethod() and @annotation(auditable)"<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">  </span>method="audit"<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style=""> </span></span><span style="color: red; font-family: 'Courier New';" lang="EN"><span style=""> </span>arg-names="auditable"</span><span style="color: blue; font-family: 'Courier New';" lang="EN">/&gt;<br /><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br />对于引入接口（<a name="_Toc144432334"><span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">Introductions</span></a>）：<br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;aop:aspect id="usageTrackerAspect" ref="usageTracking"&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">  </span>&lt;aop:declare-parents<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">      </span>types-matching="com.xzy.myapp.service.*+",<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: red; font-family: 'Courier New';" lang="EN"><span style="">      </span>implement-interface="UsageTracked"<br /><span style=""> </span><span style="">     </span>default-impl=" service.tracking.DefaultUsageTracked"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">  </span>&lt;aop:before<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>pointcut="com.xyz.myapp.SystemArchitecture.businessService()<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">              </span>and this(usageTracked)"<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN"><span style="">    </span>method="recordUsage"/&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: blue; font-family: 'Courier New';" lang="EN">&lt;/aop:aspect&gt;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"></p></span> <img src ="http://www.blogjava.net/zyl/aggbug/69805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2006-09-15 09:41 <a href="http://www.blogjava.net/zyl/archive/2006/09/15/69805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 代码分析之 beans</title><link>http://www.blogjava.net/zyl/archive/2006/09/02/67233.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Sat, 02 Sep 2006 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2006/09/02/67233.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/67233.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2006/09/02/67233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/67233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/67233.html</trackback:ping><description><![CDATA[
		<p>        这几天，闲着无事，看起了spring的源码，顺便也学习一下，人家的设计理念。<br />        spring的源码还是比较多的，但是区分的层次比较可以。对比了一下自己设计的程序，有点惭愧，每次分包的时候，设计的都比较烂。<br />        闲话少说，先来看看spring 的核心包beans。<br />        beans 包主要提供了接口和类用于处理java beans。<br />        其中最主要的接口是<font face="宋体">BeanWrapper</font>：<br />        <span lang="EN-US">Spring </span><span style="font-family: 宋体;">的中心接口，用于访问</span><span lang="EN-US">javabeans </span><span style="font-family: 宋体;">的低层操作。默认实现为</span><span lang="EN-US">BeanWrapperImpl </span><span style="font-family: 宋体;">提供分析和处理标准</span><span lang="EN-US">java beans </span><span style="font-family: 宋体;">用于</span><span lang="EN-US">get </span><span style="font-family: 宋体;">和</span><span lang="EN-US">set </span><span style="font-family: 宋体;">属性，取得属性描述，查询属性的读</span><span lang="EN-US">/</span><span style="font-family: 宋体;">写能力。<br />    用法非常简单<br />    TestBean tb = new TestBean();<br />    BeanWrapper bw = new BeanWrapperImpl(tb);<br />    bw.isReadableProperty("age");//判断age属性是否可读<br />    bw.setPropertyValue("name", "tom"); //设置name属性的值为tom<br />    bw.getPropertyValue("int2")//取得属性<br />    //当然，最强大的是能嵌套设置属性，如：<br />    //tb中有个spouse的属性，也为TestBean，这样<br />    bw.setPropertyValue("spouse.name", "tom"); <br />    //等价于tb.getSpouse().setName("tom");<br />    //bw 同样支持数组和集合,map属性设置<br />    bw.getPropertyValue("array[0].name");<br />    bw.getPropertyValue("map[key4][0].name");<br />    <br />    beans包 还提供了一个PropertyValues用于保存多个属性值，默认的实现<a name="_Toc144782329"><font face="Times New Roman"><span style="font-size: 12pt; line-height: 173%;" lang="EN-US">MutablePropertyValues</span></font></a><br />    MutablePropertyValues pvs = new MutablePropertyValues();<br />    pvs.addPropertyValue("array[0].name", "name5");<br />    pvs.addPropertyValue("array[1].name", "name4");<br />    bw.setPropertyValues(pvs);<br />    <br />    BeanWrapper的层次结构，也比较简单继承于<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">ConfigurablePropertyAccessor ，而<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">ConfigurablePropertyAccessor 又继承于<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">PropertyAccessor 和<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">   PropertyEditorRegistry 接口。<br />        有一点不太明白，为什么<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">ConfigurablePropertyAccessor 要继承于PropertyEditorRegistry <br />        PropertyEditorRegistry 的主要作用是<span style="font-size: 10.5pt; font-family: 宋体;">提供方法用于注册</span><span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US">JavaBeans PropertyEditors。默认的实现为<a name="_Toc144782321"><span style="font-size: 12pt; line-height: 173%;" lang="EN-US"><span style=""><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span style="font-size: 12pt; line-height: 173%;" lang="EN-US">PropertyEditorRegistrySupport</span></a><br /><span style="font-size: 12pt; line-height: 173%;" lang="EN-US"><o:p>        这就使得<font face="宋体">BeanWrapperImpl 也需要继承<span style="font-size: 12pt; line-height: 173%;" lang="EN-US"><font face="Times New Roman">PropertyEditorRegistrySupport，从字面意义上来说，两个类不是很有关系，其实最主要用到的方法，也就是registerDefaultEditors(),注册spring中所有的属性编辑类。<br />        beans 包中还有两个接口TypeConverter和Mergeable 。TypeConverter由BeanWrapperImpl实现，主要用于转换属性值。其主要的工作由<span style="font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">TypeConverterDelegate 这个包内类完成的。Mergeable 主要是用来合并值得，不过具体的实现，在<font size="2">org.springframework.beans.factory.support</font> 包中。<br />        beans 包中提供了两个有用的工具类，BeanUtils和PropertyAccessorUtils。</span></font></span><br /></font></o:p></span></span></span></span></span></span></span></span></p>
<img src ="http://www.blogjava.net/zyl/aggbug/67233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2006-09-02 10:10 <a href="http://www.blogjava.net/zyl/archive/2006/09/02/67233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>