`

Spring Aop简单实例入门

阅读更多

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 interface Bean {

public void theMethod();

}

虽然不是必须使用接口,但面向接口而不是面向实现编程是良好的编程实践,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管理的对象都必须通过这个工厂来创建。对象通过工厂创建后便可正常使用。

仅仅用配置文件便可把程序的每一部分组装起来。

代码:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<!--CONFIG-->

<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces">

<value>com.company.springaop.test.Bean</value>

</property>

<property name="target">

<ref local="beanTarget"/>

</property>

<property name="interceptorNames">

<list>

<value>theAdvisor</value>

</list>

</property>

</bean>

<!--CLASS-->

<bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/>

<!--ADVISOR-->

<!--Note: An advisor assembles pointcut and advice-->

<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

<property name="advice">

<ref local="theBeforeAdvice"/>

</property>

<property name="pattern">

<value>com\.company\.springaop\.test\.Bean\.theMethod</value>

</property>

</bean>

<!--ADVICE-->

<bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/>

</beans>

 

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

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

advisor通过Spring 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安装成Eclipse的一个plug-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是个很好的补充,而且会不断地出现更多的文档

 

分享到:
评论

相关推荐

    spring AOP入门实例

    用spring AOP做的最简单的日志记录小例子,特别简单,可直接运行。

    Spring AOP 入门实例1

    Spring AOP 入门实例1

    spring aop xml 实例

    aop入门。

    spring2-aop入门实例教程

    spring2-aop入门实例教程 spring2-aop入门实例教程

    spring AOP 实例(@AspectJ)

    一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......

    Spring AOP @AspectJ 入门实例

    NULL 博文链接:https://rain1109.iteye.com/blog/1838100

    Spring AOP 入门实例

    NULL 博文链接:https://lijiejava.iteye.com/blog/1180331

    spring aop学习实例

    包内是aop入门的一些小例子。包括java代码和其中用到的xml文件。一个子包(如aop包)里有一个可执行应用程序。

    Spring AOP入门及其实例讲解、下载

    NULL 博文链接:https://lynnwoo.iteye.com/blog/718928

    springAOP-dome

    使用spring实现AOP的一个简单实例,很好的一个入门例子

    Spring_02_入门篇_AOP_简单实例

    采用注解模式,和XML模式对AOP面向切面编程进行测试。

    SpringAOP入门

    本文主要是介绍SpringAOP的相关知识,在本文里面我能介绍了SpringAOP的实现机理,在实现过程中所用到的相关技术,最后,通过一个简单的实例来对SpringAOP进行实现,进而加读者对SpringAOP的理解,以达到熟练运用的...

    spring-boot入门实例(jpa+postgresql+aop实现valid切面式校验)

    spring-boot入门实例(jpa+postgresql+aop实现valid切面式校验)

    Spring基础与快速入门

    其他还有一些特点不是Spring的核心,这里只做简单陈述,如:对JDBC的封装与简化,提供事务管理功能,对O/R mapping工具(hibernate、iBATIS)的整合;提供MVC解决方案,也可以与其他web框架(Struts、JSF)进行整合...

    Spring从入门到精通 pdf

    Spring从入门到精通(第七,十四章) pdf (非影印版) 清华大学出版社 作者:郭锋 ISBN:7302138117 IoC DI AOP的讲解,条理非常清晰,结合实例,简单明了。非常适合初次接触这些概念的人。

    spring2.5学习PPT 传智博客

    使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件实现AOP 20.aspectj的切入点语法定义细节 21.搭建和配置Spring与jdbc整合的环境 22.Spring集成的jdbc编码和事务...

    spring实例教程

    spring实例教程 spring初级入门教程 手把手教你成为spring高手 近30个实例让你成为spring高手涵盖spring的大部分内容:ioc控制反转 aop面向切面编程等

    使用Spring框架实现AOP切面编程.zip

    本资源通过一个Category和Publisher表的实例,使用Spring框架实现AOP切面编程,其中实现了增删改查的功能,通过事物(tx)管理器、扫描业务逻辑、声明式事务达到切面编程效果。代码中有很详细的备注,适合新手入门

    springmvc拦截器入门实例.zip

    SpringMVC组件之拦截器组件,使用简单,入门级案例代码,类似SpringAOP,可以用来判断是否用户登录

Global site tag (gtag.js) - Google Analytics