快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳门赌场网站:Spring Framework中的面向方面编程(AOP),第一部分



作为这个先容Spring框架中的面向方面编程(Aspect-Oriented Programming,AOP)的系列的第一部分,本文先容了使您可以应用Spring中的面向方面特点进行快速开拓的根基常识。应用跟踪和记录方面(面向方面领域的HelloWorld)作为例子,本文展示了若何应用Spring框架所独占的特点来声明切入点和看护以便利用方面。本系列的第二部分将更深入地先容若何运用Spring中的所有看护类型和切入点来实现更实用的方面和面向方面设计模式。对付AOP的更一样平常性的先容,请查看ONJava站点上Graham O'Regan的文章,“Introduction to Aspect-Oriented Programming”。

本文的目的不是要先容构成模块化J2EE系统——即Spring框架——的所有紧张元素,我们将只把留意力放在Spring所供给的AOP功能上。因为Spring的模块化设计措施,我们可以只应用该框架的AOP元素,而无需对构成Spring框架的其他模块做太多斟酌。

在AOP方面,Spring供给了什么?

“它的目标不是供给最完善的AOP实现(虽然Spring AOP异常强大年夜);而是要供给AOP实现与Spring IoC的慎密集成,以便赞助办理企业利用中的常见问题。”

Spring Framework参考文档

为了实现这个目标,Spring框架今朝支持一组AOP观点,从切入点到看护。本文将展示若何应用Spring框架中所实现的如下AOP观点:

看护(Advice):若何将before看护、afterReturning看护和afterThrowing看护声明为bean。

切入点(Pointcut):若何声明静态切入点逻辑以将XML Spring Bean Configuration文件中的所有内容联系在一路。

Advisor:关联切入点定义与看护bean的要领。

设置场景:一个简单的例子利用法度榜样

“一样平常而言,Spring并不是预描述的。虽然应用好的实践异常轻易,然则它避免强制执行一种特定的措施。”

Spring Framework参考文档

要试用Spring框架的AOP功能,首先我们要创建一个简单的Java利用法度榜样。IbusinessLogic接口和BusinessLogic类为Spring框架中的bean供给了新蒲京澳门赌场网站简略单纯构件块。虽然该接口对付我们的简单利用法度榜样逻辑来说不是必需的,然则它是Spring框架所保举的优越实践。

public interface IBusinessLogic

{

public void foo();

}

public class BusinessLogic

implements IBusinessLogic

{

public void foo()

{

System.out.prin新蒲京澳门赌场网站tln(

"Inside BusinessLogic.foo()");

}

}

可以编写MainApplication类,借此演习BusinessLogic bean的公有措施。

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MainApplication

{

public static void main(String [] args)

{

// Read the configuration file

ApplicationContext ctx =

new FileSystemXmlApplicationContext(

"springconfig.xml");

//Instantiate an object

IBusinessLogic testObject =

(IBusinessLogic) ctx.getBean("businesslogicbean");

// Execute the public

// method of the bean

testObject.foo();

}

}

在BusinessLogic类及其关联接口中没有什么必要留意的。然则,MainApplication类初始化BusinessLogic工具的要领很故意思。经由过程应用ctx.getBean("businesslogicbean")调用,MainApplication将加载和治理BusinessLogic类的bean实例的义务转交给了Spring框架。

容许Spring节制BusinessLogic bean的初始化,这使得Spring运行时有时机在bean被返回给利用法度榜样之前履行J2EE系统所需的所有与bean相关的治理义务。然后Spring运行时设置设置设备摆设摆设可以抉择对bean利用哪些义务和模块。该设置设置设备摆设摆设信息由一个XML文件供给,类似于下面所示的:

IBusinessLogic

该设置设置设备摆设摆设文件,即springconfig.xml,指定要加载一个接口与IbusinessLogic相匹配的bean。该bean随后被关联到BusinessLogic实现类。看起来似乎是费了很大年夜力气只为了加载一个简单的bean并调用一个措施,然则您要知道,这个设置设置设备摆设摆设文件只是使Spring框架可以透明地对利用法度榜样利用其组件的浩繁特点的一个表现。

图1显示了基础的顺序图:MainApplication原样履行,没有利用方面。

图1.没有对BusinessLogic bean利用方面时的顺序图

请查看本文末端处的参考资料,获取这个简单Spring利用法度榜样的源代码。

利用措施跟踪(Method Tracing)方面

可能最基础的方面便是措施跟踪方面了。这可能是您找获得的最简单的方面了,是以它是钻研新的AOP实现的一个很好的动身点。

措施跟踪方面在一个目标利用法度榜样内捕获对所跟踪的措施的调用以及措施的返回值,并以某种要领显示这种信息。在AOP中,看护的before和after类型用于捕获这些类型的联络点,由于这两种看护可以在措施调用联络点之前或之后触发。应用Spring框架,措施跟踪方面的before看护是在TracingBeforeAdvice类中声明的。

import java.lang.reflect.Method;

import org.springframework.aop. MethodBeforeAdvice;

public class TracingBeforeAdvice

implements MethodBeforeAdvice

{

public void before(Method m,

Object[] args,

Object target)

throws Throwable

{

System.out.println(

"Hello world! (by " +

this.getClass().getName() +

")");

}

}

类似地,after看护可以在TracingAfterAdvice类中声明。

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class TracingAfterAdvice

implements AfterReturningAdvice

{

public void afterReturning(Object object,

Method m,

Object[] args,

Object target)

throws Throwable

{

System.out.println(

"Hello world! (by " +

this.getClass().getName() +

")");

}

}

这两个类都经由过程实现Spring框架的适当看护接口而表示了特定的看护。每种类型的看护都指定实现before(..)或afterReturning(..)措施,以便使Spring运行时可以奉告看护适当的联络点会在何时呈现。值得留意的是,TracingAfterAdvice实际上是从AfterReturningAdvice扩展而来的,表示只有在联络点在无非常的环境下得到返回值时才运行看护。

为了将看护与利用法度榜样中的适当联络点关联起来,必须对springconfig.xml进行一些改动。

IBusinessLogic

theTracingBeforeAdvisor

theTracingAfterAdvisor

.*

.*

theTracingBeforeAdvisor和theTracingAfterAdvisor advisor被添加到前面所声明的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时,这些方面就会在初始化历程中被编织进去,而BusinessLogic bean中的所有措施都将被跟踪,如图2所示。

图2. 措施跟踪方面利用到BusinessLogic bean之后的顺序图(单击图像查看大年夜图)

措施跟踪方面和例子利用法度榜样的源代码可在本文末真个参考资料小节进行下载。

方面的重用

可以对措施跟踪方面进行扩展,供给一个轻细繁杂的记录(Logging)方面。记录方面供给了一个很不错的重用例子,由于记录方面所需的许多特点都已经包孕在措施跟踪方面中了。

在本例中,记录方面扩展了措施跟踪方面,以便显示附加的与(在利用法度榜样的履新蒲京澳门赌场网站行历程中)所激发的非常有关的信息。

要完全应用记录方面,必要对利用法度榜样做一些变动。BusinessLogicException非常类供给了一个可以由IBusinessLogicInterface接口和BusinessLogic实现类新增的void bar()措施激发的非常。

public class BusinessLogicException

extends Exception

{

}

public interface IBusinessLogic

{

public void foo();

public void bar()

throws BusinessLogicException;

}

public class BusinessLogic

implements IBusinessLogic

{

public void foo()

{

System.out.println(

"Inside BusinessLogic.foo()");

}

public void bar()

throws BusinessLogicException

{

System.out.println(

"Inside BusinessLogic.bar()");

throw new BusinessLogicException();

}

}

MainApplication类现在将对void bar()措施进行一次额外的调用,并处置惩罚选中的、可能由该措施激发的非常。

import org.springframeworkcontext.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MainApplication

{

public static void main(String [] args)

{

// Read the configuration file

ApplicationContext ctx =

new FileSystemXmlApplicationContext(

"springconfig.xml");

//Instantiate an object

IBusinessLogic testObject =

(IBusinessLogic) ctx.getBean(

"businesslogicbean");

//Execute the public methods of the bean

testObject.foo();

try

{

testObject.bar();

}

catch(BusinessLogicException ble)

{

System.out.println(

"Caught BusinessLogicException");

}

}

}

来自措施跟踪方面的TracingBeforeAdvice和TracingAfterAdvice看护可以整体重用。LoggingThrowsAdvice类为新的非常记录供给了看护。

import org.springframework.aop.ThrowsAdvice;

import java.lang.reflect.Method;

public class LoggingThrowsAdvice

implements ThrowsAdvice

{

public void afterThrowing(Method method,

Object[] args,

Object target,

Throwable subclass)

{

System.out.println(

"Logging that a " +

subclass +

"Exception was thrown.");

}

}

利用记录方面的着末一步是改动springconfig.xml设置设置设备摆设摆设文件,使其包孕新添加的LoggingThrowsAdvice看护。

图3显示了运行MainApplication并应用Spring框架利用了记录方面的UML顺序图。

图3. 记录方面利用到BusinessLogic bean之后的顺序图(单击图像查看大年夜图)

此处的记录方新蒲京澳门赌场网站面清楚地阐清楚明了若何重用现有方面以及若何在Spring框架中应用看护的throws形式。经由过程为before和after看护声明新的看护来重写现有的措施跟踪方面实现,可以实现更繁杂的记录方面,记录到更繁杂的记录框架,比如LOG4J。关于记录方面和例子利用法度榜样的源代码,请拜见本文末真个参考资料小节。

停止语

本文新蒲京澳门赌场网站展示了应用Spring框架中的基础AOP布局所利用的一些简单方面。在本系列的下一篇文章中,我们将先容一些更实用的方面,探究方面的生命周期,应用Spring框架的around看护,并应用Spring来利用AOP模式。

参考资料

本文的源代码

Spring Java/J2EE Framework

Spring AOP Framework

"Introduction to Aspect-Oriented Programming"

原文出处:An Introduction to Aspect-Oriented Programming with the Spring Framework, Part 1http://www.onjava.com/pub/a/onjava/2004/07/14/springaop.html

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: