小妖女 发表于 2015-1-18 11:12:03

JAVA网页编程之Spring Framework中的面向方面编程

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系统,又是捆绑,鄙视微软之!

活着的死人 发表于 2015-1-20 17:06:02

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

再见西城 发表于 2015-1-29 13:15:40

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

谁可相欹 发表于 2015-2-1 10:17:55

是一种为 Internet发展的计算机语言

变相怪杰 发表于 2015-2-1 17:09:43

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

小女巫 发表于 2015-2-4 09:59:31

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

爱飞 发表于 2015-2-7 01:41:01

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

蒙在股里 发表于 2015-2-10 22:05:35

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

山那边是海 发表于 2015-3-1 16:01:19

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

admin 发表于 2015-3-3 11:18:49

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

飘灵儿 发表于 2015-3-11 10:19:47

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

第二个灵魂 发表于 2015-3-18 04:47:55

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
页: [1]
查看完整版本: JAVA网页编程之Spring Framework中的面向方面编程