当前位置: 首页 > 图灵资讯 > 技术篇> 新一篇: Spring事务处理及其AOP框架的内幕

新一篇: Spring事务处理及其AOP框架的内幕

来源:图灵教育
时间:2023-06-09 10:12:48

AOP正在成为软件开发的下一个圣杯。使用AOP,您可以将处理aspect的代码注入主程序,通常主程序的主要目的不是处理这些aspect。AOP可以防止代码混乱。

为了解AOP是如何做到这一点的,请考虑记录日志的工作。日志本身不太可能是您开发的主要程序的主要任务。如果你能看到“看不见的”、在主程序中注入一般日志代码,那该多好啊。AOP可以帮助你做到。

Spring framework是一种非常有前途的AOP技术。作为一种非侵略性的轻型AOP framework,您可以在Java程序中使用它,而无需使用预编译器或其他元标签。这意味着开发团队只需要一个人来处理AOP framework,其他人仍然像往常一样编程。

AOP是许多直觉难以理解的术语的根源。幸运的是,你可以通过理解三个概念来编写AOP模块。这三个概念是:advice,pointcut和advisor。advice是一个代码,您想在其他程序中注入不同的地方。pointcut定义了需要注入advice的位置,通常是特定类别的public方法。advisor是pointcut和advice的装配器,是将advice注入主程序中预定位置的代码。

既然我们知道我们需要使用advisor将“不可见”注入主要代码advice,让我们实现Spring AOP的例子。在这个例子中,我们将实现before advice,这意味着advice代码在被调用的public方法开始之前就被执行了。以下是这个before 实现advice的代码:

package com.company.springaop.test; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class TestBeforeAdvice implements MethodBeforeAdvice {   public void before(Method m, Object[] args, Object target)   throws Throwable {     System.out.println("Hello world! (by "         + this.getClass().getName()         + ")");   } }

接口MethodbeforeAdvice只需要一种方法来实现before,它定义了advice的实现。before方法共用三个参数,它们提供了相当丰富的信息。Method参数 m是advice开始后执行的方法。方法名称可作为判断代码是否执行的条件。Object[] args是传输给被调用public方法的参数组。当需要记录日志时,参数args和被执行方法的名称是非常有用的信息。您还可以更改传输给m的参数,但要小心使用此功能;编写初始主程序的程序员不知道主程序可能与传输参数发生冲突。Object target是执行方法m对象的引用。

在以下Beanimpl类中,在调用每个public方法之前,将执行advice:

package com.company.springaop.test; public class BeanImpl implements Bean {   public void theMethod() {     System.out.println(this.getClass().getName()         + "." + new Exception().getStackTrace()[0].getMethodName()         + "()"         + " says HELLO!");   } }

Beanimpl实现了以下接口Bean:

package com.company.springaop.test; public class BeanImpl implements Bean {   public void theMethod() {     System.out.println(this.getClass().getName()         + "." + new Exception().getStackTrace()[0].getMethodName()         + "()"         + " says HELLO!");   } }

Spring也鼓励这样做,虽然不需要使用接口,但面向接口而不是面向编程是一个很好的编程实践。

通过配置文件实现pointcut和advice,因此,您只需编写主方法的Java代码:

package com.company.springaop.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Main {   public static void main(String[] args) {     //Read the configuration file     ApplicationContext ctx         = new FileSystemXmlApplicationContext("springconfig.xml");     //Instantiate an object     Bean x = (Bean) ctx.getBean("bean");     //Execute the public method of the bean (the test)     x.theMethod();   } }

我们从阅读和处理配置文件开始,然后立即创建它。该配置文件将被用作粘合程序不同部分的“胶水”。在阅读和处理配置文件后,我们将得到一个创建工厂ctx。任何Spring管理的对象都必须通过工厂创建。该对象可以在工厂创建后正常使用。

程序的每个部分都可以用配置文件组装。

package com.company.springaop.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Main {   public static void main(String[] args) {     //Read the configuration file     ApplicationContext ctx         = new FileSystemXmlApplicationContext("springconfig.xml");     //Instantiate an object     Bean x = (Bean) ctx.getBean("bean");     //Execute the public method of the bean (the test)     x.theMethod();   } }

四个bean定义的顺序并不重要。我们现在有了一个advice,一个包含正则表达式pointcut的advisor,一个主程序类和一个配置好的接口,通过工厂ctx返回自己实现的参考。

Beanimpl和TestBeforeAdvice都是直接配置的。我们用唯一的ID创建了一个bean元素,并指定了一个实现类。这就是所有的工作。

通过Springing通过advisor framework提供的RegexmethodPointcutadvisor类实现。我们用advisor的属性来指定它需要的advice-bean。第二个属性用正则表达式定义pointcut,以确保良好的性能和易读性。

最后配置是bean,可以通过工厂创建。bean的定义看起来比实际更复杂。bean是ProxyFactorybean的实现,是Spring framework的一部分。这个bean的行为是通过以下三个属性来定义的:

  • 属性proxyinterface定义了接口类。
  • 属性target指向本地配置的bean,bean返回一个接口。
  • 属性interceptornames是唯一允许定义值列表的属性。该列表包含所有需要在beantarget上执行的advisor。请注意,advisor列表的顺序非常重要。

Spring工具

虽然可以手动修改Ant构建脚本,但是使用SpringUI(译注:SpringUI现在是Spring framework的一部分,改名为spring-ide),使用Spring AOP变得很简单,只需点击鼠标即可。您可以将SpringUI安装成Eclipseplug-in。然后,您只需右击您的project上的鼠标,并选择“add Spring Project Nature”。在project属性中,您可以在“Spring Project在下面添加Spring配置文件。在编译之前,将以下类库添加到project中:aopalliance.jar,commons-logging.jar,jakarta-oro-2.0.7.jar和spring.jar。在操作程序时,您将看到以下信息:

... (logging information)

Hello world! (by com.company.springaop.test.TestBeforeAdvice)

com.company.springaop.test.BeanImpl.theMethod() says HELLO!

优点和缺点

Spring比其他framework更有优势,因为除了AOP,它还提供了更多其他功能。作为一个轻型framework,它可以在J2EE的不同部分发挥作用。因此,即使你不想使用Spring, AOP,你可能还是想用Spring。另一个优点是,Spring并不要求开发团队的所有人员都使用它。Spring应该从Spring学习 reference的第一页开始。读完这篇文章后,你应该能够更好地理解Spring reference。Spring唯一的缺点是缺乏更多的文档,但它的mailing list是一个很好的补充,更多的文档会不断出现。