第3章 创建切面

原创 2007年10月14日 23:16:00
第3章 创建切面   文章指数:0  CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。
1、AOP介绍
大多数AOP定义都是关于如何使交叉业务模块化
应用系统分成多个模块,每个模块的主要业务是为它的特殊领域提供服务。然而,每个模块也需要一些相似的辅助功能,如安全和事务管理。重要通用功能的常用面向对象技术是使用继承和委托模式。但由于基础类在系统中到处使用,使用继承会引起脆弱的继承关系,委托模式比较笨拙,依然需要重复调用委托对象
在多数情况下,AOP是一种简单的替代方法。使用AOP,在一个地方定义通用功能,只是声明式定义何时何地使用这些功能,而不需要再需要新功能的地方修改代码。交叉业务现在可以被模块化到特定对象切面中。这样做,有两个好处:第一,现在每个业务逻辑放在一个地方,而不是分散到代码的各个角落。第二,服务模块更加清晰,因为他们只包含他们的核心功能,辅助功能转移到切面中
1.1、定义AOP术语
切面:要实现的交叉功能
连接点:连接点是应用程序执行过程中插入切面的地点,这个地点可以是方法调用,异常抛出。切面代码在这些地方插入到你的应用流程中,添加新的功能
通知:切面的实际实现
切入点:定义了通知应该应用在哪些连接点。通过指定类名和方法名,或者匹配类名和方法名式样的正则表达式来指定切入点
引入:引入允许为已存在的类添加新的方法和属性
目标对象:目标对象是被通知对象。如果没有AOP,这个类就必须要包含它的主要逻辑以及其他交叉业务逻辑。有了AOP,目标对象就可以全身心的关注主要业务,忘记应用其上的通知
代理:代理是将通知应用到目标对象后创建的对象。对于客户对象来说,目标对象和代理对象是一样的,应用程序的其他部分不用为了支持代理对象而改变
织入:织入是将切面应用到目标对象从而创建一个新的代理对象的过程。切面在指定接入点被织入目标对象。织入发生在目标对象生命周期的多个点上:
编译期:切面在目标对象编译时织入
类转载期:切面在目标对象被载入到JVM中时织入
运行期:切面在应用系统运行时织入。通常,AOP容器将在织入切面的时候动态生成委托目标对象的代理对象
1.2、Spring的AOP实现
在Spring中,所有的切入点都以Java类的形式编写
切入点通常编写在Spring的配置文件中
Spring在运行期间创建代理对象
Spring有两种代理创建方式:
如果目标对象实现了一个接口,Spring使用JDK的Proxy类创建代理。这个类让Spring动态产生一个新的类,它实现了所需的接口,织入了通知,并且代理对目标对象的所有请求
如果目标对象没有实现任何接口,Spring使用CGLIB库生成目标对象的子类。在创建这个子类的时候,Spring将通知织入,并且将目标对象的调用委托给这个子类
Spring只支持方法连接点
2、创建通知
通知包含了切面的逻辑。创建一个通知对象的时候,是在编写实现交叉功能的代码。Spring的连接点模型是建立在方法拦截上。编写的Spring通知会在方法调用周围的各个地方织入系统中。因为Spring在方法执行的多个地方织入通知,所以有多种通知类型
2.1、前置通知
扩展MethodBeforeAdvice接口
public interface MethodBeforeAdvice{
    void before(Method method,Object[] args,Object target)
    throws Throwable
}
这个接口为我们提供了获得目标方法、参数以及目标对象的机会。方法返回后目标方法将被调用
ProxyFactoryBean类是在BeanFactory和ApplicationContext中用来显式创建代理类对象的中心类。给它提供一个要实现的接口、一个要代理的目标对象、一个要织入的通知,它将创建一个崭新的代理对象
2.2、后置通知
实现MethodAfterAdvice接口
2.3、环绕通知
MethodInterceptor接口提供了在一个通知对象中实现前置通知和后置通知的能力
2.4、异常通知
ThrowsAdvice接口定义在异常发生时该有什么动作
2.5、引入通知
引入通知给目标对象添加新的方法以及属性
3、定义切入点
切入点决定了一个特定类的特定方法是否满足一条特定规则。如果一个方法确实符合,通知就应用到该方法上
3.1、在Spring中定义切入点
Spring根据需要织入通知的类和方法来定义切入点。通知是根据他们的特性织入目标类和方法的,如类名和方法签名
Spring切入点框架的核心接口是Pointcut接口
public interface Pointcut {
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
}
ClassFilter决定一个类是否符合通知的要求
public interface ClassFilter {
boolean matches(Class clazz);
}
实现这个接口的类决定了以参数形式传入进来的类是否应该被通知
MethodMatcher接口通过方法过滤切面
public interface MethodMatcher {
boolean matches(Method m, Class targetClass);
public boolean isRuntime();
public boolean matches(Method m, Class target, Object[] args);
}
matches(Method m, Class targetClass)方法根据目标类和方法决定一个方法是否给被通知,因为可以静态的判断,所以可以在AOP代理被创建的时候调用一次这个方法。这个方法的结果最终决定了通知是否被织入
如果matches(Method m, Class targetClass)方法返回ture,isRuntime()用来决定MethodMatcher的类型,有两种类型:静态和动态。静态切入点的意思是通知总是被执行。如果一个切入点是静态的,isRuntime()方法应该返回false。动态切入点根据运行时方法的参数值决定通知是否需要执行。如果一个切入点是动态的,isRuntime()方法应该返回ture。isRuntime()方法在代理类创建时调用一次
对于动态切入点,目标对象方法每次被调用的时候,matches(Method m, Class target, Object[] args)方法被调用
3.2、理解Advisor
大多数切面是由定义切面行为的通知和定义切面和什么地方执行的切入点如何而成的
大多数Spring自带的切入点都有一个对应的PointcutAdvisor,方便在一个地方定义切入点和通知
    public interface PointcutAdvisor {
Pointcut getPointcut();
Advice getAdvice();
}
4、创建引入
其他类型通知是在方法调用的周围织入到不同的连接点。而引入则是影响整个类。他们通过给需要消息的类添加方法和属性来实现。也就是说,用一个已经存在的类让它实现另外的接口,维持另外的状态
4.1、实现IntroductionInterceptor
Spring通过特殊的方法拦截器接口IntroductionMethodInterceptor接口来实现引入
引入通知为对象添加了新的接口和新的属性
5、使用ProxyFactoryBean
ProxyFactoryBean创建代理对象
6、自动代理
对于小型应用系统,可以使用ProxyFactoryBean创建代理对象,因为没有许多类需要通知
Spring有一种自动代理机制,可以让容器产生代理
7、小结
AOP是面向对象编程的一个有力补充。有了切面,可以将从前分散在应用系统中的功能重组变成可重用组件。现在可以采用声明方式或编码方式来定义这些功能应用到哪里,以及如何使用。这样减少了重复代码,并且将代码专注于它的主要功能上
Spring提供了一个AOP框架,能够将切面添加到方法执行的周围。可以在方法调用的前面,后面以及周围织入通知,也可以为异常处理添加定制行为
使用Spring的切入点机制定义在哪里将通知织入应用系统。一般会使用Spring预定义的静态切入点
除了在方法周围添加通知之外,引用能够为应用对象添加新的方法和属性。引用可以动态创建复合对象,给予多继承一样的能力
Spring提供了多种方便的创建代理对象的方法,使用ProxyFactoryBean,可以完全掌握代理的创建。当使用自动代理时,也有许多灵活的控制方法
 

循序渐进之Spring AOP(5) - 创建切面

在掌握了可用的Advice后,接下来要做的就是精确的描述切点。前面的示例都是指定一个目标类并把增强织入到所有方法中,实际开发显然会有更多的选择可能性,比如对所有类中名称以test结尾的方法加入监控执行...
  • autfish
  • autfish
  • 2016年04月17日 14:59
  • 6445

注解方式创建切面

嘿,小伙伴,上一篇我们一起学习了 XML 方式创建切面。看到了那么感到烦吧,这一次给你整个简单地玩玩。那就是使用注解方式创建切面。 @AspectJ使用注解来创建切面是 AspectJ 5 引入的关键...
  • github_34889651
  • github_34889651
  • 2016年05月09日 14:33
  • 1522

面向切面的 Spring —— 如何使用注解创建切面?

使用注解来创建切面是 AspectJ 5 所引入的关键特性。我们前一篇已经定义了 Performance 接口,它是切面中切点的目标对象。Q:如何定义切面?A: 给出一个描述:如果一场演出没有观众的话...
  • tinyDolphin
  • tinyDolphin
  • 2017年08月10日 14:53
  • 317

第三章 AOP 通过Java API创建切面

在前面使用增强的时候,我们发现增强会被织入到目标类的所有的方法中。我们如果把增强织入到目标类的特定的方法中,需要使用切点进行目标连接点的定位。然后我们可以通过切点及增强生成一个切面了。 ...
  • p_3er
  • p_3er
  • 2013年07月05日 11:34
  • 2499

精通Excel数据统计和分析 - 摘要(第3章:假设检验)

假设检验
  • youngmiffy
  • youngmiffy
  • 2017年07月23日 20:06
  • 306

Java实现AOP面向切面编程的实例教程

这篇文章主要介绍了Java实现AOP面向切面编程的实例教程,通常Java中的AOP都是利用Spring框架中造好的轮子来开发,而本文则关注于Java本身AOP的设计模式实现,需要的朋友可以参考下 ...
  • AlbenXie
  • AlbenXie
  • 2017年05月27日 17:32
  • 1319

什么是面向切面编程AOP?

作者:知乎用户 链接:https://www.zhihu.com/question/24863332/answer/48376158 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非...
  • u010012493
  • u010012493
  • 2017年02月18日 11:20
  • 555

Spring(十一)使用Spring的注解方式实现面向切面技术AOP

AOP涉及到的一些概念: Aspect(切面):横切性关注点的抽象即为切面,与类相似,只是两者的关注度不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。 Joinpoint(连接点):所谓连接...
  • u011731233
  • u011731233
  • 2015年07月25日 18:43
  • 4221

Spring 通过注解方式实现AOP切面编程

Spring 切面编程的目的是实现代码的业务逻辑的解耦。切面编程用于诸如日志记录,事务处理,等非业务性的逻辑操作。目前Spring的Aop只能应用于方法层级上,无法在类、成员字段等层级上操作。以下是S...
  • zouqingfang
  • zouqingfang
  • 2016年02月24日 14:34
  • 2006

SpringMVC学习笔记(三) 切面详解

为了更好的理解AOP,先来了解几个AOP的术语。 通知(Advice) 指切面(定义为aspect的类)中的工作; spring切面可以应用的五种通知: 前置通知(Before):在目标方法被调用之前...
  • u013399093
  • u013399093
  • 2017年03月09日 16:37
  • 833
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第3章 创建切面
举报原因:
原因补充:

(最多只允许输入30个字)