AOP中国的名字叫做面向方面编程。这个名字是很形象。因为你真的可以把像面包切系统。并直接增加面包的修改。科而异,对整个系统,小到一定的方法。

AOP它有什么用?有关示例,各组分可以含有安全、事务、,AOP就是把每一个组件中的安全作为一个方面进行集中处理。事务作为一个方面,数据库作为一个方面等等。这样才干做到高内聚、低耦合。

AOP中有三个重要的术语:通知、切点、连接点。

他们之间的关系例如以下图。

AOP实现的原理是改动目标类中的代码。

至于怎么改动,有多种方式:编译时、类载入时、执行时。编译时改动须要特殊的编译器。类载入时改动须要特殊的类载入器。执行时。就是应用在执行的时候AOP框架会为目标对象生成一个动态代理类。Spring AOP採用的就是执行时代理。

Spring容器通过ObjectFactory创建全部的Bean实例。而且实例之外添加一层动态代理。

SpringAOP具体实现主要涉及到反射机制中的Proxy.newProxyInstance和InvocationHandler。在兴许的JVM文章中还会具体介绍。

除了Spring AOP眼下流行的AOP框架还有AspectJ、JBoss AOP。

以下是AOP的Hello World程序。目标是,在某个类的createApple方法调用之前做一些事情,可是又不能直接改变这种方法的代码。以下这段代码就是在createApple方法运行之前,额外运行beforeCreateApple,有点类似于Hook。

代码例如以下:

<bean id="appleListener" class="xxx"/>

<aop:aspect ref="appleListener">
<aop:pointcut id="apple" expression="execution(* *.createApple(..))" /> <aop:before pointcut-ref="apple" method="beforeCreateApple" />
</aop:aspect>

上面这段代码的意思是。当程序中不论什么一个类的createApple方法被调用之前,都先调用appleListener中的beforeCreateApple方法。

切点表达式语言。上面样例中的execution(* *.createApple(..))就是表达式语言。第一个星号表示返回值的类型。第二个星号表示被调用的类名。

支持例如以下语法:

  • args() 将參数传递给切面
  • @args() 匹配注解才传递參数
  • execution() 匹配详细的方法
  • this() 匹配当前bean
  • target() 匹配目标对象
  • @target() 匹配目标对象的注解
  • within() 匹配实例的类型
  • @within() 匹配实例的注解
  • @annotation() 匹配注解
  • bean() 匹配bean id

以下举例说明切点表达式语言。

// 切点为运行com.example.Apple.eat方法,返回值随意。參数随意。
execution(* com.example.Apple.eat(..)) // within表示仅仅匹配com.example.*下的随意方法。用了and连接符号。
execution(* com.example.Apple.eat(..) and within(com.example.*)) // bean表示匹配对应的bean
execution(* com.example.Apple.eat(..) and bean(apple))

以下的样例演示了切点的各种修饰方式。

<aop:config>
<!--定义切面,test是事先定义好的一个bean-->
<aop:aspect ref="test">
<!--定义切点-->
<aop:pointcup id="apple-eat" expression="execution(* com.example.Apple.eat(..))"/> <!--在切点之前调用test.beforeEat-->
<aop:before pointcut-ref="apple-eat" method="beforeEat"/> <!--在切点运行成功之后调用-->
<aop:after-return pointcut-ref="apple-eat" method="eatSuccess"/> <!--在切点运行失败之后调用-->
<aop:after-throwing pointcut-ref="apple-eat" method="eatFailed"/> <!--在切点之后调用。无论成功失败-->
<aop:after pointcut-ref="apple-eat" method="afterEat"/> <!--围绕通知。以下有具体说明-->
<aop:around pointcut-ref="apple-eat" method="eatApple"/> <!--动态添加接口,以下有具体说明-->
<aop:declare-parents types-matching="com.example.Apple+" implement-interface="com.example.Fruit" default-impl="com.example.FruitImpl"/>
</aop:aspect>
</aop:config>

现代化的Spring支持注解方式的切面。以下请看样例。

// 定义切面
@Aspect
public class Test {
// 定义切点。方法中不须要写不论什么代码。
@Pointcut("execution(* com.example.Apple.eat(..))")
public void appleEat() { } // 切面之前
@Before("appleEat()")
public void beforeEat() { } // 切面运行成功之后
@AfterReturning("appleEat()")
public void eatSuccess() { } // 切面运行失败之后
@AfterThrowing("appleEat()")
public void eatFailed() { } // 切面之后。无论成功失败
@After("appleEat()")
public void afterEat() { } // 围绕切面,以下有具体说明
@Around("appleEat")
public void eatApple(ProceedingJoinPoint joinpoint) { } // 定义传递參数的切点
@Pointcut("execution(* com.example.Apple.eat(..)) and args(size)")
public void appleEat2() { } // 接收切点的參数
@Before("appleEat2")
public void beforeEat2(int size) {
// 可以得到切点的size參数
}
}

围绕通知。它的目的是为了解决切点前后无法通信的问题。本质是四种切点的结合体。比方我想记录一个切点的运行时间。就须要用到围绕通知。以下是围绕通知的代码。

public void eatApple(ProceedingJoinPoint joinPoint) {
// 在切点之前
System.out.println("before pointcut"); // 手动运行切点
joinPoint.proceed(); // 在切点之后
System.out.println("after pointcut");
}

Introduction引入,也就是动态添加新接口。它的作用就是在程序执行的过程中动态地为一个实例添加接口。请看以下的样例。

// Introduction引入。
@DeclareParents(value="com.example.Phone+", defaultImpl="com.example.AppleWatchImpl")
public static AppleWatch appleWatch;

上面的样例中给appleWatch字段添加了一个注解。意思是让appleWatch字段能够转换使Phone种类。最初appleWatch它不能被转换成Phone的。

版权声明:本文博主原创文章。博客,未经同意不得转载。

Spring相框:AOP详细说明的更多相关文章

  1. Spring框架-AOP详细学习[转载]

    参考博客:https://blog.csdn.net/qq_22583741/article/details/79589910#4-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85% ...

  2. spring的IOC和AOP详细讲解

    1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同时, ...

  3. Spring相框

    1.什么是Spring相框?Spring有哪些主要模块框架? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台. Spring帮助开发人员攻克了开发中基础性的问 ...

  4. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  5. Spring实现AOP的4种方式

    了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...

  6. Spring实现AOP的4种方式(转)

    转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定 ...

  7. Chapter 4: Spring and AOP:Spring's AOP Framework -- draft

    Spring's AOP Framework Let's begin by looking at Spring's own AOP framework - a proxy-based framewor ...

  8. Spring Framework AOP具体解释

    此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.近期项目中遇到了下面几点需求,细致思考之后,认为採用AOP来解决.一方面是为了以更加灵活的方式来解决这个问题,还有 ...

  9. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  10. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

随机推荐

  1. Intent有可能的使用(两)

    Intent作为联系各Activity之间的纽带,其作用并不只只限于简单的数据传递. 通过其自带的属性.事实上能够方便的完毕非常多较为复杂的操作. 比如直接调用拨号功能.直接自己主动调用合适的程序打开 ...

  2. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

    以下是一些设计略显繁琐,有必要清除思维. 下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径. 流程如图普遍认 ...

  3. Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志

    Tethering技术在移动平台上已经运用的越来越广泛了.它能够把移动设备当做一个接入点,其它的设备能够通过Wi-Fi.USB或是Bluetooth等方式连接到此移动设备.在Android中能够将Wi ...

  4. 生活中的大数据 hadoop

    大数据和我有关吗?大数据就是大量的数据吗?只有互联网公司才有大数据吗?想盘活大数据必须买昂贵的软硬件吗?大数据怎么存储计算?大数据,这个时下最火热的互联网词语,你了解多少呢?

  5. Java NIO内存映射---上G大文件处理(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...

  6. js多个物体运动的问题1

    问题2 http://www.cnblogs.com/huaci/p/3854304.html 用js写一个物体的运动很简单.如果一个页面有多个物体在运动,它会不会出问题呢? ok,我们来看一个示例 ...

  7. HDU 4313 Matrix

    水题:在一个双连通的树上有一些点很有破坏性,我们要把这些带破环性的点隔开,就是破坏一些边使这些点之间不连通,破坏一条边需要一点时间,问最少需要多少时间(同一时间只能破坏一个地方,且忽略位置转移的时间) ...

  8. Sails.js中文文档

    Sails.js中文文档   http://sailsdoc.swift.ren/ Sails.js是一个Web框架,可以于轻松构建自定义,企业级Node.js Apps.它在设计上类似于像Ruby ...

  9. HPUX在oracle10g安装和卸载缩写

    创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/ ...

  10. nyoj 7 街区最短路径问题 【数学】

    找出横纵坐标的中位数,怎么找:先对x排序找x的中位数x0,再对y排序找y的中位数y0:最后统计各点到中位数点(x0, y0)的总距离: 街区最短路径问题 时间限制:3000 ms  |  内存限制:6 ...