AOP(Aspect Oriented Programming,意思是面向切面编程)
OOP(Object Oriented Programming,意思是面向对象编程)
AOP是sprig框架的关键组件,它是OOP编程方式的一种补充,OOP模块化的单元是类,AOP中的模块化单元是切面,切面可以实现跨类型和对象之间的事务管理、日志等方面的模块化。
OOP用继承和组合的方式,编成一套类和对象的体系;AOP对于某包某类某命名方法,采用同样方式处理。
AOP的优点:
1)提供声明式的企业服务,这种服务是声明式事务管理。
2)允许用户实现自定义切面,在某些不适合用OOP的场景中采用AOP。
3)可以对业务逻辑的各部分进行隔离,使业务逻辑各部分间的耦合度降低,提高程序可用性和开发效率。
AOP核心概念
Aspect(切面)
切面将关注点进行模块化,某些关注点可能会跨多个对象,如事务管理。可以使用常规类(基于模式的方法)或@Aspect注解的类来实现切面。
Join Point(连接点)
它是在程序执行过程中某个特定的点,如某方法调用时或处理异常时,在AOP中一个连接点总是代表一个方法的执行。
Advice(通知)
它是在切面的某个特定的连接点上执行的动作。AOP框架都是以拦截器来实现通知模型的,并维护一个以连接点为中心的拦截器链。Advice分为以下几种类型:
1)Before Advice(前置通知):在某连接点之前进行的通知,它不能阻止连接点前的执行。
2)After Returning Advice(返回后通知):在某连接点正常完成后执行的通知,若一个方法没有抛出异常,将正常返回。
3)After Throwing Advice(抛出异常后通知):在方法抛出异常退出时执行的通知。
4)After Advice(最后通知):在某连接点退出执行的通知,不管正常返回还是异常退出。
5)Around Advice(环绕通知):环绕一个连接点的通知,如方法调用。它是最常用的也是最强大的通知类型,可以在方法调用前后完成自定义的行为,也会选择是否继续执行连接点,或直接返回它们的返回值或抛出异常结束执行。与AspectJ一样,spring提供所有类型的通知,推荐使用简单的通知类型来实现所需功能。如果只需用一个方法的返回值来更新缓存,最好使用After Returning Advice,而非Around Advice。
Pointcut(切入点)
它是匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。切入点表达式和连接点的匹配是AOP的核心,spring默认使用AspectJ切入点语法。
Introduction(引入)
声明额外的方法或某个类型的字段。spring允许引入新的接口到任何被通知的对象。
Target Object(目标对象)
是被一个或多个切面所通知的对象,也称为被通知(Advised)对象。AOP是通过运行时代理实现的,则这个对象永远是一个被代理(Proxied)对象。
AOP Proxy(AOP代理)
AOP框架创建的对象,用来实现Aspect Contract(切面契约)包括通知方法执行等功能。spring中AOP代理分为JDK动态代理和CGLIB代理。
Weaving(织入)
把切面连接到其他应用程序类型或对象上,并创建一个Advised对象,这些可以在编译时、类加载时和运行时完成。spring框架在运行时完成织入。
Spring AOP与AspectJ
spring AOP采用Java实现,无需专门的编译过程,也不需要控制类装载器层次,它适用于servlet容器或应用服务器。
spring仅支持方法调用作为连接点,spring并没有实现成员变量拦截器,如果需要通知对成员变量的访问和更新连接点,可以考虑使用AspectJ。spring并不是提供最完整的AOP实现,它更侧重于提供一种AOP实现和spring IOC容器的整合,来解决企业级开发中的问题。spring AOP通常和spring IOC容器一起使用。
spring AOP并非通过提供一种全面的AOP解决方案来取代AspectJ,它们之间是互补关系。spring可以无缝整合AOP、AspectJ、IOC,使所有的AOP应用融入基于spring的体系。
AOP代理
spring默认使用标准的JDK动态代理作为AOP代理,它也支持CGLIB代理,当需要代理类时,CGLIB代理是更好的选择。如果一个业务对象没有实现接口,则默认使用CGLIB。面向接口编程的业务对象通常都会实现一个或多个接口,在那些需要通知一个未在接口中声明的方法,或需要传递一个代理对象作为一种具体类型的方法时,可以强制使用CGLIB。
--参考文献《Srping5开发大全》
网友评论