AOP概念
让我们从定义一些重要的AOP概念开始。
— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。
— 引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。
— 目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。
— AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
— 编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
各种通知类型包括:
— Around通知:包围一个连接点的通知,如方法调用。这是最强大的通知。Aroud通知在方法调用前后完成自定义的行为,它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短路执行。
— Before通知:在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
— Throws通知:在方法抛出异常时执行的通知。Spring提供强制类型的Throws通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从Throwable或Exception强制类型转换。
— After returning通知:在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。
Around通知是最通用的通知类型。大部分基于拦截的AOP框架(如Nanning和Jboss 4)只提供Around通知。
如同AspectJ,Spring提供所有类型的通知,我们推荐你使用最为合适的通知类型来实现需要的行为。例如,如果只是需要用一个方法的返回值来更新缓存,你最好实现一个after returning通知,而不是around通知,虽然around通知也能完成同样的事情。使用最合适的通知类型使编程模型变得简单,并能减少潜在错误。例如,你不需要调用在around通知中所需使用的MethodInvocation的proceed()方法,因此就调用失败。
切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。切入点使通知独立于OO的层次选定目标。例如,提供声明式事务管理的around通知可以被应用到跨越多个对象的一组方法上。 因此切入点构成了AOP的结构要素。
下面让我们实现一个Spring AOP的例子。在这个例子中,我们将实现一个before advice,这意味着advice的代码在被调用的public方法开始前被执行。以下是这个before advice的实现代码。
package com.ascenttech.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方法共用3个参数,它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法,方法名称可以用作判断是否执行代码的条件。Object[] args是传给被调用的public方法的参数数组。当需要记日志时,参数args和被执行方法的名称都是非常有用的信息。你也可以改变传给m的参数,但要小心使用这个功能;编写最初主程序的程序员并不知道主程序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用。
在下面的BeanImpl类中,每个public方法调用前,都会执行advice,代码如下。
package com.ascenttech.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.ascenttech.springaop.test;
public interface Bean {
public void theMethod();
}
虽然不是必须使用接口,但面向接口而不是面向实现编程是良好的编程实践,Spring也鼓励这样做。
pointcut和advice通过配置文件来实现,因此,接下来你只需编写主方法的Java代码,代码如下。
package com.ascenttech.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.ascenttech.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.ascenttech.springaop.test.BeanImpl"/>
<!--ADVISOR-->
<!--Note: An advisor assembles pointcut and advice-->
<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethod PointcutAdvisor">
<property name="advice">
<ref local="theBeforeAdvice"/>
</property>
<property name="pattern">
<value>com\.ascenttech\.springaop\.test\.Bean\.theMethod</value>
</property>
</bean>
<!--ADVICE-->
<bean id="theBeforeAdvice" class="com.ascenttech.springaop.test.TestBefore Advice"/>
</beans>
4个bean定义的次序并不重要。我们现在有了一个advice、一个包含了正则表达式pointcut的advisor、一个主程序类和一个配置好的接口,通过工厂ctx,这个接口返回自己本身实现的一个引用。
BeanImpl和TestBeforeAdvice都是直接配置。我们用一个惟一的ID创建一个bean元素,并指定了一个实现类,这就是全部的工作。
advisor通过Spring framework提供的一个RegexMethodPointcutAdvisor类来实现。我们用advisor的第一个属性来指定它所需的advice-bean,第二个属性则用正则表达式定义了pointcut,确保良好的性能和易读性。
最后配置的是bean,它可以通过一个工厂来创建。bean的定义看起来比实际上要复杂。bean是ProxyFactoryBean的一个实现,它是Spring framework的一部分。这个bean的行为通过以下的3个属性来定义。
— 属性proxyInterface定义了接口类。
— 属性target指向本地配置的一个bean,这个bean返回一个接口的实现。
— 属性interceptorNames是惟一允许定义一个值列表的属性,这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pss360/archive/2009/04/30/4139630.aspx
分享到:
相关推荐
这对于理解Spring的工作原理,以及优化和扩展Spring AOP功能具有重要意义。 在实际开发中,Spring AOP的应用非常广泛,它可以极大地简化代码,提高代码的可维护性和可复用性。通过阅读和理解Spring AOP的源码,...
《ProSpring——Spring专业开发指南》是一本深入探讨Spring框架的专业书籍,旨在帮助开发者全面理解和掌握Spring的核心概念、功能及最佳实践。通过阅读本书,你可以深入理解Spring如何为Java应用程序提供强大的依赖...
在深入理解 Spring AOP 的源码时,需要熟悉 Spring IoC 的工作原理,以及 AOP 相关的概念,如切点表达式、通知类型等。了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者...
在压缩包文件"spring-aop-aspectj"中,可能包含了关于Spring AOP和@AspectJ的示例代码或文档,可以帮助你进一步理解和实践这些知识。通过学习和实践,你将能更好地掌握这一强大的工具,从而在你的IT职业生涯中征服...
《深入解析Spring AOP框架——以spring-aop.jar为例》 Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的核心部分之一,它为Java开发者提供了强大的面向切面的编程能力。本文将围绕...
首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是关注点的模块化,如日志或事务管理;通知是在特定连接点执行的行为;连接点...
在"SpringAOP测试Demo"中,我们通常会涉及以下几个核心概念和操作: 1. **切面(Aspect)**:切面是关注点的一个模块化,它包括了连接点、通知、目标对象、织入和引入。在Spring AOP中,切面通常由一个或多个注解的...
首先,我们来理解Spring AOP的基本概念。在Spring中,切面由通知(advises)和切点(pointcuts)组成。通知是在特定的程序执行点执行的代码,例如方法调用前或后。切点则是定义这些执行点的规则,通常基于方法签名或...
首先,我们需要知道Spring AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和代理(Proxy)。切面是封装了特定关注点的模块,如日志或事务管理。通知是在特定连接点...
通过以上步骤,你可以在Spring Security 2.0中有效地配置和利用AOP进行方法级别的权限控制。这不仅增强了应用的安全性,还使得权限管理更加灵活和可扩展。请确保在实际项目中根据具体需求进行适配和调整。
这个库定义了如MethodInterceptor和Pointcut等基本的AOP概念,使得Spring和其他AOP框架如AspectJ可以共享相同的接口。在Spring中,你可以通过实现这些接口来创建自定义的切面,实现拦截器功能。 其次,aspectjrt-...
首先,让我们详细讨论Spring的核心概念——依赖注入(DI)。依赖注入是Spring框架的基础,它使得组件之间的耦合度降低,提高了代码的可测试性和可维护性。通过XML配置文件、注解或Java配置类,Spring能够管理对象的...
标题 "spring aop" 描述了我们今天要探讨的核心主题——Spring AOP(面向切面编程)。这是一种在Spring框架中广泛使用的编程模型,它允许程序员将关注点分离为不同的部分,使得代码更易于维护和扩展。这篇博文链接...
首先,我们要了解Spring的核心概念——IoC(Inversion of Control)和DI(Dependency Injection)。IoC将对象的创建和管理权交给了Spring容器,而DI则允许容器根据需要向对象注入所需的服务。这两个概念是Spring框架...
在本文中,我们将探讨Spring的核心组件——IOC(Inversion of Control)和AOP(Aspect-Oriented Programming)以及它们在Spring中的应用。 首先,我们来了解什么是IOC。IOC,即控制反转,是Spring框架的核心特性之...
雷丰阳老师的Spring AOP教程深入浅出地讲解了这一概念,通过源代码分析,使开发者能够更好地理解和应用。 首先,我们要理解AOP的基本概念。AOP是一种编程范式,它将关注点(如日志、安全检查等)从主业务逻辑中分离...
《Spring技术内幕——深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制与设计理念的专业书籍。本书旨在帮助读者全面理解Spring的内部工作原理,从而更好地应用和优化Spring框架在实际开发中的使用。...
你可以通过查看这些文件来更深入地理解Spring AOP的工作原理和用法。 总之,Spring的AOP功能提供了一种强大的机制,使得我们可以将关注点分离,提升代码的组织结构和可维护性。通过这个小案例,你将能够更好地理解...
本文将深入探讨Spring的核心特点——控制反转(IoC)和面向方面编程(AOP),以及它们在Spring框架中的实现原理。 **一、控制反转(IoC)** 控制反转(Inversion of Control,简称IoC)是Spring的核心概念之一,它...