`

SpringAOP入门(转)

阅读更多

一,Spring AOP初探

        使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。

        AOP是很多直觉难以理解的术语的根源。幸运的是,你只要理解三个概念,就可以编写AOP模块。这三个概念是:advice(通知)、pointcut(切点)和advisor(通知器)。advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置,通常是某个特定的类的一个public方法。advisor是pointcut和advice的装配器,是将advice注入主程序中预定义位置的代码。

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

package song;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class TestBeforeAdvice implements MethodBeforeAdvice{

	@Override
	public void before(Method m, Object[] args, Object target)
			throws Throwable {
		// TODO Auto-generated method stub
		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 song;

public class BeanImpl implements Bean{

	@Override
	public void theMethod() {
		// TODO Auto-generated method stub
		System.out.println(this.getClass().getName()+"."
				+new Exception().getStackTrace()[0].getMethodName()
				+"() says HELLO!");
	}
}

        类BeanImpl实现了下面的接口Bean:

package song;

public interface Bean {
	
	public void theMethod();
}

        虽然不是必须使用接口,但面向接口而不是面向实现编程是良好的编程实践,Spring也鼓励这样做。pointcut和advice通过配置文件来实现,因此,接下来你只需编写主方法的Java代码:

package song;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext ctx = 
			new FileSystemXmlApplicationContext("springconfig.xml");
		
		Bean x = (Bean)ctx.getBean("bean");
		
		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>song.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="song.BeanImpl"/>
 
 <!-- ADVISOR -->
 <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <property name="advice">
   <ref local="theBeforeAdvice"/>
  </property>
  <property name="pattern">
   <value>song.Bean.theMethod</value>
  </property>
 </bean>
 
 <!-- ADVICE -->
 <bean id="theBeforeAdvice" class="song.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。

 

三,优点和缺点

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

分享到:
评论

相关推荐

    spring AOP入门实例

    在这个入门实例中,我们将深入理解Spring AOP如何实现简单日志记录。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是AOP中的核心...

    spring AOP入门教程

    - **SpringAOP.avi**:可能是一个视频教程,详细讲解了Spring AOP的概念和实践。 - **SpringAOP.doc**:可能是文档教程,包含了详细的步骤和示例代码。 - **SpringAOP_src.rar**:源代码示例,供你参考和实践。 - **...

    Spring AOP 入门作者:廖雪峰

    ### Spring AOP 入门详解 #### 一、Spring AOP 概述 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个关键特性,它为开发者提供了在运行时动态添加代码(即横切关注点或切面)到已有...

    最简单的SpringAOP入门案例

    本教程将通过一个简单的Spring AOP入门案例,帮助初学者理解这一概念。 ### 一、AOP基础 1. **切面(Aspect)**:切面是关注点的模块化,它封装了跨越多个对象的行为或数据。在Spring AOP中,切面可以由一个类定义...

    Spring AOP 入门实例

    **Spring AOP 入门实例** 在Java编程中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它允许程序员定义“横切关注点”,如日志、事务管理、性能监控等,然后将这些关注点与核心业务逻辑...

    Spring AOP 入门实例1

    以下是一个简单的Spring AOP入门实例步骤: 1. 首先,定义一个切面类,包含通知方法。例如,一个简单的日志切面: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example*...

    Spring 入门案例——AOP

    本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在Spring AOP中,我们首先需要了解的是"切面"(Aspect)的概念。切面是封装了横切关注点的代码模块,它可以包含通知(Advice)、切点(Pointcut)和...

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

    **Spring AOP 入门及其实例讲解** 在软件开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它旨在提高代码的可重用性,减少冗余,并将关注点分离。Spring框架是Java开发中的一个流行...

    Spring AOP简单demo

    **Spring AOP 简介** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务...

    SpringSpring Aop基础入门

    Spring Aop基于xml练习

    SPRING AOP详细培训视频

    视频教程中提到的"AOP快速入门"部分可能涵盖了以下内容: 1. AOP基本概念的介绍,包括切面、通知、连接点和代理等。 2. 如何定义和使用切点表达式来指定通知的执行时机。 3. 不同类型的通知(Before、After、After ...

    spring aop注解版

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理等。在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的...

    SpringAOP简单入门示例..pdf

    Spring AOP 简单入门示例 AOP(Aspect-Oriented Programming),即面向方面编程,是一种编程范式。AOP 是 OOP 的补充,它将系统中的横切性关注点模块化,并将其与业务逻辑分离。 在 Spring 中,AOP 是通过使用 ...

    Spring AOP快速入门_源码

    Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了一种模块化和声明式的方式来处理横切关注点,如日志、事务管理、性能监控等。在传统的面向对象编程...

    Spring Aop基础入门

    Spring Aop基于annotation注解练习

    Spring -Aop入门

    ### Spring AOP 入门详解 #### 一、Spring AOP 概述 Spring AOP (Aspect Oriented Programming) 是一种面向切面编程的技术,在Spring框架中得到了良好的支持。通过这种方式,开发者可以更加灵活地组织代码,使得...

    spring aop 详细介绍

    5. **Spring AOP入门**: Spring AOP通过XML配置或者注解方式来实现AOP功能。在XML配置中,可以定义Bean、Advisor、Pointcut等元素。在注解方式下,可以使用`@Aspect`、`@Before`、`@After`、`@AfterReturning`、`@...

    spring aop管理xml版

    **Spring AOP 管理XML版详解** 在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的设计模式,它扩展了传统的面向对象编程(OOP),使得我们可以将关注点分离,特别是那些横切关注...

    spring的aop简单例子

    Spring的AOP(面向切面编程)是一种编程范式,它允许程序员在不修改源代码的情况下,通过插入称为切面的代码片段来增强程序的功能。这个简单例子将帮助我们理解AOP的基本概念和如何在Spring框架中实现它。 首先,...

Global site tag (gtag.js) - Google Analytics