Spring AOP详解
Spring AOP四种实现方式Demo详解
AOP相关概念 : 在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
AOP面向切面编程:通过预编译方式和动态代理实现程序功能的统一维护
在框架中利用AOP对业务逻辑的各个部分进行隔离,从而使业务逻辑耦合度降低,提高开发效率.
IOC控制反转:在spring之前对象创建都是要手动处理,现在把对象的创建交给spring进行配置(两种配置方式:.xml 创建对象和通过工厂类创建对象)
DI依赖注入:在IOC基础上完成想类里面属性设置的过程
重点内容
Spring容器中提供了AOP技术,利用它实现拦截监控
Spring是一个轻量级的控制反转和面向切面的容器框架
AOP用jdk和cglib两种代理方式实现拦截
aop 底层原理 :
1> AOP横向抽取机制: 动态代理方式
(1) jdk动态代理, 针对有接口的情况, 创建接口实现类代理对象
(2) cglib动态代理, 针对没有接口的情况,子类调用父类的方法实现增强/通知
连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
增强(advice,另译为通知: 在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice
切入点(Pointcut): 指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上
引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口
目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
Spring AOP都有哪些通知(增强 )?
前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
后置通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
后置通知可以访问返回值(但不能进行修改),被调用方法,方法参数以及目标对象。
异常通知[After throwing advice]:在连接点抛出异常后执行。
最终通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理连接点(调用ProceedingJoinPoint的proceed方法)还是中断执行。