马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C#是盗用了Java的源代码,仿照开发的,原因是Java是开源的啊,盗了也白盗,还有一点,开发C#语言的团队是就是开发Java语言的团队,是微软重金挖过去的啊编程 作为这个先容Spring框架中的面向方面编程(Aspect-OrientedProgramming,AOP)的系列的第一部分,本文先容了使您可使用Spring中的面向方面特征举行疾速开辟的基本常识。利用跟踪和纪录方面(面向方面范畴的HelloWorld)作为例子,本文展现了怎样利用Spring框架所独占的特征来声明切进点和关照以便使用方面。本系列的第二部分将更深切地先容怎样使用Spring中的一切关照范例和切进点来完成更有用的方面和面向方面计划形式。关于AOP的更一样平常性的先容,请检察ONJava站点上GrahamORegan的文章,“IntroductiontoAspect-OrientedProgramming”。
本文的目标不是要先容组成模块化J2EE体系――即Spring框架――的一切主要元素,我们将只把注重力放在Spring所供应的AOP功效上。因为Spring的模块化计划办法,我们能够只利用该框架的AOP元素,而无需对组成Spring框架的其他模块做太多思索。
在AOP方面,Spring供应了甚么?
“它的方针不是供应最完美的AOP完成(固然SpringAOP十分壮大);而是要供应AOP完成与SpringIoC的严密集成,以便匡助办理企业使用中的罕见成绩。”
SpringFramework参考文档
为了完成这个方针,Spring框架今朝撑持一组AOP观点,从切进点到关照。本文将展现怎样利用Spring框架中所完成的以下AOP观点:
关照(Advice):怎样将before关照、afterReturning关照和afterThrowing关照声明为bean。
切进点(Pointcut):怎样声明静态切进点逻辑以将XMLSpringBeanConfiguration文件中的一切内容接洽在一同。
Advisor:联系关系切进点界说与关照bean的体例。
设置场景:一个复杂的例子使用程序
“一样平常而言,Spring并非预形貌的。固然利用好的理论十分简单,可是它制止强迫奉行一种特定的办法。”
SpringFramework参考文档
要试用Spring框架的AOP功效,起首我们要创立一个复杂的Java使用程序。IbusinessLogic接口和BusinessLogic类为Spring框架中的bean供应了浅易构件块。固然该接口关于我们的复杂使用程序逻辑来讲不是必须的,可是它是Spring框架所保举的优秀理论。
publicinterfaceIBusinessLogic
{
publicvoidfoo();
}
publicclassBusinessLogic
implementsIBusinessLogic
{
publicvoidfoo()
{
System.out.println("InsideBusinessLogic.foo()");
}
}
能够编写MainApplication类,借此实习BusinessLogicbean的私有办法。
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.FileSystemXmlApplicationContext;
publicclassMainApplication
{
publicstaticvoidmain(String[]args)
{
//Readtheconfigurationfile
ApplicationContextctx=newFileSystemXmlApplicationContext("springconfig.xml");
//Instantiateanobject
IBusinessLogictestObject=(IBusinessLogic)ctx.getBean("businesslogicbean");
//Executethepublic
//methodofthebean
testObject.foo();
}
}
在BusinessLogic类及其联系关系接口中没有甚么必要注重的。可是,MainApplication类初始化BusinessLogic对象的体例很成心思。经由过程利用ctx.getBean("businesslogicbean")挪用,MainApplication将加载和办理BusinessLogic类的bean实例的义务转交给了Spring框架。
同意Spring把持BusinessLogicbean的初始化,这使得Spring运转时无机会在bean被前往给使用程序之前实行J2EE体系所需的一切与bean相干的办理义务。然后Spring运转时设置能够决意对bean使用哪些义务和模块。该设置信息由一个XML文件供应,相似于上面所示的:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC
"-//SPRING//DTDBEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--Beanconfiguration-->
<beanid="businesslogicbean"class="org.springframework.aop.framework.ProxyFactoryBean">
<propertyname="proxyInterfaces">
<value>IBusinessLogic</value>
</property>
<propertyname="target">
<reflocal="beanTarget"/>
</property>
</bean>
<!--BeanClasses-->
<beanid="beanTarget"class="BusinessLogic"/>
</beans>
</BEANS>
该设置文件,即springconfig.xml,指定要加载一个接口与IbusinessLogic相婚配的bean。该bean随后被联系关系到BusinessLogic完成类。看起来仿佛是费了很鼎力气只为了加载一个复杂的bean并挪用一个办法,可是您要晓得,这个设置文件只是使Spring框架能够通明地对使用程序使用其组件的浩瀚特征的一个别现。
显现了基础的按次图:MainApplication原样实行,没有使用方面。
.没有对BusinessLogicbean使用方面时的按次图
<P> 使用办法跟踪(MethodTracing)方面
大概最基础的方面就是办法跟踪方面了。这多是您找失掉的最复杂的方面了,因而它是研讨新的AOP完成的一个很好的出发点。
办法跟踪方面在一个方针使用程序内捕捉对所跟踪的办法的挪用和办法的前往值,并以某种体例显现这类信息。在AOP中,关照的before和after范例用于捕捉这些范例的联合点,由于这两种关照能够在办法挪用联合点之前或以后触发。利用Spring框架,办法跟踪方面的before关照是在TracingBeforeAdvice类中声明的。
importjava.lang.reflect.Method;
importorg.springframework.aop.MethodBeforeAdvice;
publicclassTracingBeforeAdvice
implementsMethodBeforeAdvice
{
publicvoidbefore(Methodm,Object[]args,Objecttarget)
throwsThrowable
{
System.out.println("Helloworld!(by"+this.getClass().getName()+")");
}
}
相似地,after关照能够在TracingAfterAdvice类中声明。
importjava.lang.reflect.Method;
importorg.springframework.aop.AfterReturningAdvice;
publicclassTracingAfterAdvice
implementsAfterReturningAdvice
{
publicvoidafterReturning(Objectobject,Methodm,Object[]args,Objecttarget)
throwsThrowable
{
System.out.println("Helloworld!(by"+this.getClass().getName()+")");
}
}
这两个类都经由过程完成Spring框架的得当关照接口而暗示了特定的关照。每品种型的关照都指定完成before(..)或afterReturning(..)办法,以便使Spring运转时能够告知关照得当的联合点会在什么时候呈现。值得注重的是,TracingAfterAdvice实践上是从AfterReturningAdvice扩大而来的,暗示只要在联合点在无非常的情形下取得前往值时才运转关照。
为了将关照与使用程序中的得当联合点联系关系起来,必需对springconfig.xml举行一些修正。
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC
"-//SPRING//DTDBEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--Beanconfiguration-->
<beanid="businesslogicbean"class="org.springframework.aop.framework.ProxyFactoryBean">
<propertyname="proxyInterfaces">
<value>IBusinessLogic</value>
</property>
<propertyname="target">
<reflocal="beanTarget"/>
</property>
<propertyname="interceptorNames">
<list>
<value>theTracingBeforeAdvisor</value>
<value>theTracingAfterAdvisor</value>
</list>
</property>
</bean>
<!--BeanClasses-->
<beanid="beanTarget"
class="BusinessLogic"/>
<!--Advisorpointcutdefinitionforbeforeadvice-->
<beanid="theTracingBeforeAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<propertyname="advice">
<reflocal="theTracingBeforeAdvice"/>
</property>
<propertyname="pattern">
<value>.*</value>
</property>
</bean>
<!--Advisorpointcutdefinitionforafteradvice-->
<beanid="theTracingAfterAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<propertyname="advice">
<reflocal="theTracingAfterAdvice"/>
</property>
<propertyname="pattern">
<value>.*</value>
</property>
</bean>
<!--Adviceclasses-->
<beanid="theTracingBeforeAdvice"class="TracingBeforeAdvice"/>
<beanid="theTracingAfterAdvice"class="TracingAfterAdvice"/>
</beans>
theTracingBeforeAdvisor和theTracingAfterAdvisoradvisor被增加到后面所声明的businesslogicbean。每一个advisor都大概截获一切bean所联系关系到的联合点。Advisor自己就是bean,而它独一的感化就是将切进点界说与关照bean联系关系起来。本例中的切进点界说是在静态对象条理布局中指定相干联合点的正则表达式。
由于本例中利用了org.springframework.aop.support.RegexpMethodPointcutAdvisor切进点advisor,切进点逻辑是利用正则表达式指定的。正则表达式用于辨认私有接口对IbusinessLogici接口的联合点。上面是一些能够用来指定IBusinessLogic接口上的分歧联合点汇合的正则表达式例子:
.*:该表达式选择advisor所联系关系到的一个或多个bean上的一切联合点。
./IBusinessLogic/.foo:该表达式只选择IbusinessLogic接口上的foo()办法的联合点。假如是advisor所联系关系到的bean,则该表达式只选择IBusinessLogic接口上的联合点。
springconfig.xml文件中最初的bean声明指定完成关照bean的类。
既然已指定了跟踪方面的准确设置,那末下一次实行MainApplication时,这些方面就会在初始化过程当中被编织出来,而BusinessLogicbean中的一切办法都将被跟踪,如所示。
.办法跟踪方面使用到BusinessLogicbean以后的按次图
<P> 方面的重用
能够对办法跟踪方面举行扩大,供应一个略微庞大的纪录(Logging)方面。纪录方面供应了一个很不错的重用例子,由于纪录方面所需的很多特征都已包括在办法跟踪方面中了。
在本例中,纪录方面扩大了办法跟踪方面,以便显现附加的与(在使用程序的实行过程当中)所激发的非常有关的信息。
要完整利用纪录方面,必要对使用程序做一些变动。BusinessLogicException非常类供应了一个能够由IBusinessLogicInterface接口和BusinessLogic完成类新增的voidbar()办法激发的非常。
publicclassBusinessLogicException
extendsException
{}
publicinterfaceIBusinessLogic
{
publicvoidfoo();
publicvoidbar()
throwsBusinessLogicException;
}
publicclassBusinessLogic
implementsIBusinessLogic
{
publicvoidfoo()
{
System.out.println("InsideBusinessLogic.foo()");
}
publicvoidbar()
throwsBusinessLogicException
{
System.out.println("InsideBusinessLogic.bar()");
thrownewBusinessLogicException();
}
}
MainApplication类如今将对voidbar()办法举行一次分外的挪用,并处置选中的、大概由该办法激发的非常。
importorg.springframeworkcontext.ApplicationContext;
importorg.springframework.context.support.FileSystemXmlApplicationContext;
publicclassMainApplication
{
publicstaticvoidmain(String[]args)
{
//Readtheconfigurationfile
ApplicationContextctx=newFileSystemXmlApplicationContext("springconfig.xml");
//Instantiateanobject
IBusinessLogictestObject=(IBusinessLogic)ctx.getBean("businesslogicbean");
//Executethepublicmethodsofthebean
testObject.foo();
try
{
testObject.bar();
}
catch(BusinessLogicExceptionble)
{
System.out.println("CaughtBusinessLogicException");
}
}
}
来自办法跟踪方面的TracingBeforeAdvice和TracingAfterAdvice关照能够全体重用。LoggingThrowsAdvice类为新的非常纪录供应了关照。
importorg.springframework.aop.ThrowsAdvice;
importjava.lang.reflect.Method;
publicclassLoggingThrowsAdvice
implementsThrowsAdvice
{
publicvoidafterThrowing(Methodmethod,Object[]args,Objecttarget,Throwablesubclass)
{
System.out.println("Loggingthata"+subclass+"Exceptionwasthrown.");
}
}
使用纪录方面的最初一步是修正springconfig.xml设置文件,使其包括新增加的LoggingThrowsAdvice关照。
显现了运转MainApplication并利用Spring框架使用了纪录方面的UML按次图。
.纪录方面使用到BusinessLogicbean以后的按次图
此处的纪录方面分明地申明了怎样重用现无方面和怎样在Spring框架中利用关照的throws情势。经由过程为before和after关照声明新的关照来重写现有的办法跟踪方面完成,能够完成更庞大的纪录方面,纪录到更庞大的纪录框架,好比LOG4J。
停止语
本文展现了利用Spring框架中的基础AOP布局所使用的一些复杂方面。在本系列的下一篇文章中,我们将先容一些更有用的方面,切磋方面的性命周期,利用Spring框架的around关照,并利用Spring来使用AOP形式。
没有那个大公司会傻了吧唧用.net开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net不行,限制在window系统,又是捆绑,鄙视微软之! |