文档章节

aop

龙之天空
 龙之天空
发布于 2015/07/29 10:53
字数 1479
阅读 6
收藏 0


AOP术语:

1、通知(Adivce)

通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它应该应用于某个方法

个方法被调用之前?之后?之前和之后?还是只在方法抛出异常时?

   String 切面可以应用5种类型的通知

a、Before -- 在方法被调用之前调用通知

b、After  -- 在方法被调用之后调用通知

c、After-returning -- 在方法成功执行之后调用通知

d、After-throwing -- 在方法抛出异常后调用通知

e、Around -- 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定的行为

    2、连接点(Joinpoint)

连接点是在应用执行过程中能够插入切面的一个点。

3、切点(Poincut)

4、切面(Aspect)

5、引入(Introduction)

引入允许我们向现有的类添加新方法或属性。例如,我们可以创建以个Auditable通知类,该类记录了对象最后一次修改时的

状态。这很简单,只需一种方法,setLastModified(Date),和一个实例变量来保存这个状态。然后,这个新方法和实例变量就

可以被引入到现有的类中。从而可以在无需修改这类现有的类的情况下,让他们具有新的行为和状态。

6、织入(Weaving)

织入是将切面应用到目标对象来创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里

有多个点可以进行织入。

a、编译期 -- 切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。

b、类加载器 -- 切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),他可以在目标类被引入

            应用之前增强该目标类的字节码。AspectJ5的LTW(loading-time weaving)就支持以这种方式织入切面

c、运行期 -- 切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象。

           Spring AOP 就是以这种方式织入切面的。

Spring 只支持方法连接点。 AspectJ和Jboss,除了方法切点,他们还提供了字段和构造器接入点 。Spring缺少对字段连接点的支持,

无法让我们创建细粒度的通知,例如拦截对象字段的修改。而且Spring也不支持构造器连接点,我们也无法在Bean创建时应用通知。



Spring 的 AOP 配置元素简化了基于pojo切面的声明

AOP配置元素                   描述

<aop:advisor>                定义aop通知器

<aop:after>                  定义aop后置通知(不管被通知的方法是否执行成功)

<aop:after-returning>        定义AOP after-returning通知

<aop:after-throwing>         定义after-throwing通知

<aop:around> 定义AOP环绕通知

<aop:aspect>                 定义切面

<aop:aspectj-autoproxy>      启用@Aspecctj注解驱动的去切面

<aop:before>                 定义AOP前置通知

<aop:config>                 顶层的aop配置,大多数的<aop:*>元素必须包含在<aop:config>元素内

<aop:declare-parents>        为被通知的对象引入额外的接口,并透明的实现

<aop:pointcut>               定义切点

通过切面引入新功能:

使用Spring AOP,我们可以为Bean引入新的方法。代理拦截调用并委托给实现该方法的其他对象。我们需要注意的是,当引入接口的

方法被调用时,代理将此调用委托给实现了新接口的某个其他独享。实际上,Bean的实现被拆分到了多个类。

新功能:

package com.springinaction.springidol

public interface Contestant{

void receiveAward();

}

<aop:aspect>

<aop:declare-parents

type-matching = "com.springinaction.springidol.Performer+"

implement-interface="com.springinaction.springidol.Contestant"

default-impl="com.springinaction.springidol.GraciousContestant"

/>

</aop-aspect>

顾名思义,<aop:declare-parents>声明了此切面所通知的Bean在对他的对象层次结构中拥有新的父类型。

具体到本示例中,类型匹配Perpormer接口(由types-match属性指定)的那些Bean会实现Contestant接口(

由implements-interface属性指定)。最后要解决的问题是Constestant接口中的方法实现来自于何处

这里有两种方式标识所引入接口的实现。在本示例中,我们使用default-impl属性通过他的全限定类名来显示

指定Contestant的实现。或者,我们还可以使用delegate-ref属性来标识.


<aop:aspect>

<aop:declare-parents

type-matching = "com.springinaction.springidol.Performer+"

implement-interface="com.springinaction.springidol.Contestant"

delegate-ref="contestaantDelegate"

/>

</aop-aspect>

delegate-ref 属性引用了一个Spring Bean作为引入的 委托。这需要在Spring上下文中存在一个ID为contestantDelefate

的Bean。

<bean id="contestaantDelegate" class="com.springinaction.springidol.GraciousContestant"/>

使用def-impl来直接标识委托和间接使用delegate-ref的区别在于后者是Spring Bean,他本身可以被注入,被通知,或者使用其他Spring配置

              spring借助ApectJ的切点表达式语言来定义Spring切面

AspectJ指示器            描述

arg()                   限制连接点匹配参数未指定类型的执行方法

@arg()                  限制连接点匹配参数由指定注解标注的执行方法

execution()             用于匹配是连接点的执行方法

this()                  显示连接点匹配AOP代理的Bean应用为指定类型的类

target()                限制连接点匹配目标对位为指定类型的类

@target()               限制连接点匹配特定的执行对象,这些对象对应的类要具备指定类型的注解

                within()                限制连接点匹配指定的类型

                @with()                 限制连接点匹配指定注解所标注的类型(当使用AOP时,方法定义在由指定的注解所标注的类里)

           @annotation             限制匹配带有指定注解连接点






















© 著作权归作者所有

共有 人打赏支持
上一篇: html 基础
龙之天空
粉丝 7
博文 79
码字总数 18140
作品 0
宁波
私信 提问
Spring配置文件applicationContext.xml(2)之AOP

AOP的xml版本 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns si="http://www.w3.org/2001/XMLSchema-instance" xmlns:context......

绝影
2012/04/13
0
0
Spring笔记4---前置后置通知

开始聊聊注解! Spring切面可以应用5种类型的通知: 1 Before---在方法被调用之前调用通知 2 After--- 在方法完成之后调用通知,无论方法执行是否成功 3 After-returning---在方法成功执行之...

强子哥哥
2015/01/11
0
0
Spring如何配置多个类

是这样的,我有个工程,有很多的类,我需要对每一个类的每一个方法进行织入,所以需要在xml中进行配置,请问有没有办法不用在xml中编写每一个bean呢,比如类似通过pattern 我从下面的网址下载...

一个凡人
2016/03/03
475
5
Guice Aop 与 Hasor Aop 原理及其实现

这篇是承接《轻量级 Java 开发框架 设计》系列Blog文的后续文章,本文主要介绍 Hasor 中 AOP 方面的设计以及实现。 提起 Aop 大家并不陌生,OSC中也不缺乏优秀的介绍文章。因而我也不费唇舌去...

哈库纳
2013/11/22
0
11
Spring框架 - AOP概述

AOP概述 日志 我们需要在不同业务逻辑的头尾都添加日志等相同功能 缺点 如果在也 代码重复 耦合业务逻辑与非业务逻辑 AOP AOP可以把业务逻辑与非业务逻辑从工程组织上分开。 AOP优点 代码重用...

抢小孩糖吃
2016/10/15
22
0

没有更多内容

加载失败,请刷新页面

加载更多

想问一下C++里queue要怎么遍历

如题,想知道怎么遍历<queue>对象的元素? 貌似不能遍历。要么全部pop push一遍,要么换个容器呗。 queue是先进后出的数据类型,只能不断读top()然后再pop()掉。故意把遍历操作隐藏掉了,...

shzwork
昨天
2
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
2
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
3
0
【转】go get命令使用socket代理

由于某些不可描述的原因,国内使用go get命令安装某些包的时候会超时导致失败,比如net包、sys包、tools包等。第一种解决办法就是自己从git上下载后添加链接到GOPATH中,比如: 1234...

yiduwangkai
昨天
6
0
从上往下打印出二叉树的每个节点,同层节点从左至右打印。

//第一种做法 public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList <Integer> li=new ArrayList<Integer>(); ArrayList <TreeN......

南桥北木
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部