概述
AOP是什么
按照软件重构的思想,如果类中出现了相同的代码,就应该考虑定义一个共同的抽象类,将这些相同的代码抽取到抽象类中。但是我们不能通过抽象父类的方式消除重复性的横切代码,因为横切逻辑依附在业务类方法流程中。
AOP通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复代码提供了方法。AOP将分散在各个业务逻辑代码中相同的代码通过横向切割的方式抽取到一个独立的模块中,并将独立的模块融合到业务逻辑中。
术语解释
增强(Advice)
增强是织入目标类连接点上的一段程序代码。在spring中增强除了描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,就可以找到特定的连接点了。spring提供的增强类接口都是带方位的,如:BeforeAdvice、AfterRetuningAdvice、ThrowsAdvice等。
引介(Introduction)
引介是一种特殊的增强,它为类添加了一些属性和方法,这样即使一个业务类没有实现某个接口,通过AOP的引介功能,可以动态的为该业务添加接口的实现逻辑,让业务的类成为这个接口的实现类。
织入(Weaving)
织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:
代理(Proxy)
一个类被AOP织入增强后,就产出一个结果类,它是融合了原类和增强逻辑的代理类,根据不同的代理方式,代理类可能是与原类相同的接口的类,也可以是原类的子类。所以可以通过调用原类的方式调用代理类。
切面(Aspect)
切面有切点和增强组成。它既包含了横切逻辑的定义,也包含了连接点的定义。spring AOP 就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。
创建增强类
spring使用增强类定义横切逻辑,同时spring只支持方法连接点,增强还包括了在在方法的哪一点加入横切代码的方位信息,所以增强既包含横切逻辑,也包含一部分连接点的信息。
增强类型
spring中支持5中增强类型:
前置增强:在目标类方法调用前执行
后置增强:在目标类方法调用后执行
环绕增强:允许在目标类方法前后织入横切逻辑
异常抛出增强:最适合的场景是事务管理
引介增强:在目标类的方法中增加一些属性和方法
总结
AOP是OOP的有益补充,可以将重复性的横切逻辑代码抽取到单独的一个统一模块中,只有通过OOP的纵向抽取和AOP的横向抽取,程序才能正真的解决重复性代码的问题。
spring采用JDK动态代理和CGLib动态代理技术在运行期织入增强,所以用户不用需要装备特殊的编译器和类加载器就可以使用AOP的功能。使用JDK动态代理,目标类必须实现接口。而CGLib不对目标类做任何限制,它通过动态的生成目标类的子类的方式提供代理。JDK在创建代理对象时性能高于CGLib,而生成代理对象运行性能低于CGLib。如果是singleton的代理,推荐使用CGLib的动态代理。
spring只能在方法级别上 织入增强,spring提供4中类型的增强方法,分别是前置增强,后置增强,环绕增强,异常抛出增强,此外还有一个特殊的引介增强,引介增强是类级别的,它为目标类织入新的接口实现。从广义上说,增强其实是一种简单的切面,它既包含横切代码也包含切点信息,只不过它的切点信息只是方法相对位置信息。所以增强需要和切点联合,才能表示一个更具实用性的切面。
在spring中普通的切点通过目标类名和方法名描述连接点的信息,流程切点是比较特殊的切点,它通过方法调用堆栈的运行环境信息来决定连接点。有时候需要通过切点的交叉或合并描述一个最终的切点,这时可以使用ComposablePointcut的复合切点。
切面是增强和切点的联合体,用户可以方便的通过spring提供的ProxyBeanFactory将切面织入不同的目标类中,当然每一个目标类手动配置一个切面是比较繁琐的,spring利用BeanPostProcess可以干涉Bean的生命周期的机制,提供了一些可以自动创建代理,织入切面的自动代理创建机,其中DefaultAdvisorAutoProxyCreator是功能抢到的自动代理创建器,它可以将容器中的所有Advisor自动织入目标Bean中。
最后
以上就是奋斗橘子为你收集整理的spring3.0就是这么简单——spring AOP的全部内容,希望文章能够帮你解决spring3.0就是这么简单——spring AOP所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复