《spring技术内幕》之AOP

一:概念
1,Aspect是一种新的模快话机制,从关注点钟分立出横切关注点是面向切面的程序设计的核心概念。分离关注点使解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不在含有针对特定领域问题代码的嗲用,业务逻辑同特定领域问题的关系通过切面来封装,维护。
2,使用AOP不仅可以将一些重复的代码中抽取出来单独维护,在统一调用时HIA可以使这些代码灵活运用
3,在springAOP中使用的是java本身的语言特性,如代理,拦截器等技术,来完成AOP编织的实现。
4,Advice通知:
advice定义在连接点做什么,为切面增强提供织入接口。BeforeAdvice,AfterAdvice,ThrowsAdvice
Pointcut切点:
切点决定Advice通知应该作用于哪个连接点,也就是说通过pointcut来定义需要增强的方法的集合。
Advisor通知器:
完成对目标方法的切面增强设计(Advice)和关注点的设计(Pointcut)以后,需要一个对象把他们结合起来,完成这个作用的就是通知器,通过Advisor,可以定义应该使用哪个通知并在哪个关注点使用他,也就是说通过Advisor,吧Advice与Pointcut结合起来,这个结合为使用ioc容器配置AOP应用。
在SpringAOP中,DefaultPointcutAdvisor类中有advice与pointcut两个属性。
二:设计与实现
1:JVM的动态代理特性
在springAOP实现中,使用的核心技术就是动态代理。
2:设计分析
SpringAOP的核心技术是JDK的动态代理技术,实现横切比如前置通知,返回通知,异常通知。
启动代理对象的拦截器来完成各种横切面的织入是通过Adapter来实现的,通过一系列的Adpater的设计可以吧AOP横切面设计与Poxy模式有机的结合起来
3:应用场景
一方面:可以直接使用AOP的功能,设计应用的横切关注点,吧跨越应用程序多个模块功能抽象出来,并通过简单的AOP来使用,灵活的编织到模块中,比如日志功能,
另一方面:在spring内部,一些支持模块比如事务
三:建立代理对象
1设计原理:
在AOP中,一个主要部分是代理对象的生成,通过ProxyFactory为设计中心,
2配置ProxyFactoryBean
在实现原理中,主要是以ProxyFactoryBean的实现为入口
(1)定义使用的通知器Advisor
(2)定义ProxyFactoryBean
(3)定义target属性
四:ProxyFactoryBean生成AOPProxy代理对象
ProxyFactoryBean的AOP实现需要依赖JDK或者CGLIB提供的Proxy特性
JDK生成代理对象和CGLIB生成代理对象
五:AOP拦截调用的实现
1:原理
在springAOP通过 JDK的 Proxy方式或者CGLIB方式生成代理对象的时候,相关拦截器已经配置到代理对象中去了,拦截器在代理对象中起的作用是通过对这些方法的回调来完成的
2,JDKDynamicAopProxy的invoke拦截
3,Cglib2AopProxy的intercept拦截
4,不管什么的拦截,他们度连接器链的调用都是在ReflectiveMethodInvocation中通过proceed方法来实现的:
在proceed方法中,先进行判断,如果现在已经运行到拦截器链的末尾,那么久会直接调用目标对象的实现方法,否则,沿着拦截器链继续进行,得到下一个拦截器,用过这个拦截器进行matched判断,判断是都是适用于横切增强的和徐昂个,如果是,从拦截器中得到通知器,并启动通知其的invoke方法进行切面增强,在这个过程结束后,会迭代调用proceeed方法。
六:配置通知器
七:用ProxyFactory实现AOP
spring实现AOP的两种方式: ProxyFactoryBean,ProxyFactory
ProxyFactory实现原理与 ProxyFactoryBean是一样的, ProxyFactory没有使用IOC封装,而是通过直接继承ProxyCreatotSupport的功能来完成AOP配置
八:高级特性
1,在使用springAOP时,对目标对象的增强是通过拦截器来完成的。
2,Spring的TargetSource接口特性:对于一些应用场合,需要对目标对象本身进行一些处理,比如如何从一个对象池或者对象工厂中获取目标对象。

九:总结
spirngAOP的实现方式:ProxyFactoryBean,ProxyFactory
SpringAOP基本实现:通过得到AOPProxy代理对象来对拦截器进行处理,代理对象的生成通过java的Proxy,反射技术以及CGLIB技术(生成代理对象:JDKDynamicAopProxy和Cglib2AopProxy)。在生成代理对象的同时进行了拦截器的配置。
得到代理对象后,拦截回调。

猜你喜欢

转载自blog.csdn.net/hq091117/article/details/79065163