AOP本质 #
AOP(Aspect Orient Programming)也就是面向切面编程,作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。其实AOP问世的时间并不太长,AOP和OOP互为补充,面向切面编程将程序运行过程分解成各个切面。
AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。
- 面向切面编程, 利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分的耦合度降低, 提高程序的重用性。
- 不修改源代码方式, 在主干功能中添加新功能, 利用的是动态代理模式。
AOP只是增强了方法, 使用还是与Bean管理一样
AOP的基本概念 #
AOP操作术语 #
关于面向切面编程的一些术语:
- 切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。
- 连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。
- 增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有”around”、”before”和”after”等类型
- 切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。
- 连接点类中可以被增强的方法
- 切入点实际被增强的方法
- 通知(增强)实际增强的逻辑部分
- 切面把通知应用到切入点的过程
通知的类型: #
(1) 前置通知 @Before
(2) 后置通知 @AfterReturning
(3) 环绕通知 @Around
(4) 异常通知 @AfterThrowing
(5) 最终通知 @After
通知的执行顺序 #
正常执行: @Before > @After > @AfterReturning
异常执行: @Before > @After > @AfterThrowing

AOP前置知识 #
- Spring框架一般都是基于AspectJ实现AOP操作AspectJ不是Spring组成部分, 它是独立的AOP框架, 一般把AspectJ和Spring框架一起使用, 进行AOP操作<!– Maven配置 –>
- 切入点表达式
- 切入点表达式的作用: 让AspectJ知道要对哪些方法进行增强
AOP的底层实现原理 #
* JDK动态代理
* cglib动态代理
Spring的AOP的底层采用两种代理机制:
* JDK的动态代理:
* 只能对实现了接口的类生成代理.
- CGLIB的动态代理:
- 可以对没有实现接口的类生成代理.(采用的是比较底层的字节码技术,对类生成一个子类对象.)
Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。
基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术,认识这两代理技术,有助于探究Spring AOP的实现机理。只要你愿意,你甚至可以抛开Spring,提供自己的AOP实现。