目录
AOP(Aspect-Oriented Programming)面向切面编程:为了解耦,让一组类共享相同的行为。
通过代理模式为目标对象生产代理对象,并将横切逻辑插入到目标方法执行的前后。
在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能在哪里,以什么方式应用,并且不必修改影响的类。这样一来横切关注点就被模块化到特殊对象(切面)里。
OOP与AOP对比:
都可以:重用通用功能
OOP(Object-Oriented Programming)中通过继承和实现接口,来使代码的耦合度增强,并且继承只能为单继承,阻碍更多行为添加到一组类上。
AOP弥补了OOP的不足,降低耦合度。
AOP好处:
- 每个事物逻辑位于一个位置,代码不分散,便于维护和升级。
- 业务模块更简洁,只包含核心业务代码。次要关注点的代码被转移到切面中了。
AOP术语:
***通知(Advice):切面的工作被称为通知
通知分类:
***连接点(Joinpoint):程序执行的某个位置。连接点是在应用执行过程中能够插入切面的一个点,这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为。
***切点(pointcout):是一组连接点,会匹配通知所要织入的一个或多个连接点,有助于缩小切面所通知的连接点的范围。
***切面(Aspect):是通知和切点的结合,通知和切点共同定义了切面的全部内容——它是什么,在何时何处完成其功能。
横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象
引入(Introduction):向现有的类添加新方法或属性。
织入(Weaving):把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入。
在切点的引导下,将通知逻辑插入到方法调用上,使得我们的通知逻辑在方法调用时得以执行。
通过实现后置处理器 BeanPostProcessor 接口。
织入时间:
目标(Target):被通知的对象
代理(Proxy):向目标对象应用通知之后创建的对象
核心:
Spring提供了两种配置AOP的方式:xml,注解
动态代理:
指在程序运行置期间动态的将某段代码切入到指定方法指定位进行运行的编程方式。
Spring 代理如果有接口就选择JDK动态代理,否则就选择dglib代理。
请参考下面这篇博客:静态代理、动态代理
应用:
日志、事务、安全验证