科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用Spring 2.0和AspectJ简化企业应用程序

用Spring 2.0和AspectJ简化企业应用程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在本文中,作者首先了介绍在典型的企业应用程序中,Spring AOP和AspectJ适用于什么地方,之后介绍在2.0中新的Spring AOP支持。

作者:Adrian Colyer译者 俞黎敏 来源:infoq.com 2007年11月18日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共10页)

Spring 2.0中新的AOP支持
2.0中的Spring AOP可以完全向后与Spring 1.x应用程序和配置兼容。它还提供了比Spring 1.x更简单且更强大的配置。新的AOP支持是基于schema的,因此在你的Spring beans配置文件中将需要相关的命名空间和schema定位属性。它看起来像这样:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
...

与使用DTD时所需要的更简单的xml配置相比,那么目前为止我们还没有超越——但这是标准的xml配置,并且可以在你的IDE中的一个模板里创建,并且只在每当你需要创建一个Spring配置时才被重用。当我们开始将一些内容添加到配置中时,你会领略到这一好处。

Spring 2.0默认使用AspectJ 切入点语言(受执行连接点种类的限制)。如果它看到一个AspectJ 切入点表达式,它就调出AspectJ对它进行解析和匹配。这意味着你用Spring AOP编写的任何切入点表达式都将以与AspectJ完全相同的方式进行工作。此外,Spring实际上能理解@AspectJ方面,因此有可能共用Spring和AspectJ之间完整的方面定义。激活这项功能很容易,只要将元素包括在你的配置中。如果AspectJ自动代理以这种方式激活,那么在你的应用程序上下文中定义的、包含@AspectJ方面的任何bean,都将被Spring AOP视为一个方面,并将相应地通知上下文中的bean。

下面是当你以这种方式使用Spring AOP时的Hello World程序。首先,应用程序上下文文件中bean元素的内容:

class="org.aspectprogrammer.hello.spring.HelloService"/>

class="org.aspectprogrammer.hello.aspectj.HelloFromAspectJ"/>

HelloService是一个简单的Java类:

public class HelloService {
public void main() {
System.out.println("Hello World!");
}
}

HelloFromAspectJ与你在本文前面见过的被注解的Java类(@AspectJ方面)完全相同。以下是启动Spring容器的一个小主类,获得一个对helloService bean的引用,并在它上面调用’main’方法:

public class SpringBoot {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"org/aspectprogrammer/hello/spring/application-context.xml");
HelloService service = (HelloService) context.getBean("helloService");
service.main();
}
}

运行这个程序产生下面的输出:

Hello World!
Hello from AspectJ!

记住,这仍然是Spring AOP(我们根本没有在使用AspectJ编译器或者织入器),但它是提供关于@AspectJ方面的反射信息和解析并匹配代表Spring的切入点的AspectJ。

Spring 2.0还支持用一个简单的POJO支持的方面声明的一种xml形式(不需要任何注解)。xml形式也使用相同的AspectJ 切入点语言子集,并支持相同的五种AspectJ 通知类型(前置通知(before advice)、后置通知(after returning advice)、异常通知(after throwing advice)、后通知(after [finally] advice)和 环绕通知(around advice))。

下面是使用一个基于XML的方面声明的hello world应用程序:

  class="org.aspectprogrammer.hello.spring.HelloService"/>






class="org.aspectprogrammer.hello.spring.HelloAspect"/>

aop命名空间中的元素可以用来声明方面、切入点和通知,有着与它们的AspectJ和@AspectJ等效物完全相同的语义。“aspect”元素引用Spring bean(完全由Spring配置和实例化),并且每个通知元素都在该bean中指定将被调用来执行通知的方法。在这个例子中,HelloAspect类只是:

public class HelloAspect {
public void sayHello() {
System.out.println("Hello from Spring AOP!");
}
}

运行程序将产生熟悉的输出:

Hello World!
Hello from Spring AOP!

如果你还没有编写过这样的程序,就下载Spring 2.0,亲自尝试一下,这可是个好主意。

我不想把本文变成是关于Spring AOP的一个完全的教程,而是想要加紧看一些可以有效地以这种方式实现的特性实例。我将只是指出,传递Spring从使用AspectJ 切入点语言中获得的其中某个东西,是编写静态类型的通知(声明它们真正需要的那些参数的方法)的能力,与始终使用非类型的Object数组相反——这使得通知方法更容易编写。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章