AOP被称为实施横切面的工具;
AOP是面向对象编程OOP的补充;
横切面关注点是指应用程序中无法从应用程序的其余部分分解并且可能导致重复和紧密耦合的逻辑;
通过使用AOP模块化各个逻辑部分(关注点)可以将它们应用于应用程序的多个部分,而无须复制代码和创建硬性依赖关系;
AOP类型:静态AOP和动态AOP
静态AOP:横切面逻辑将在编译时应用于代码,修改时需要重新编译,比如AspectJ编译时织入机制所提供的静态AOP,
动态AOP:springAOP,横切面逻辑在运行时动态应用,这可以更改AOP配置而无需编译。
代理是springAOP工作方式的一个重要组成部分,两种代理方式:JDK动态代理和CGlib代理;
1、应用场景:日志和安全性校验
AOP组成部分:
连接点:定义了在应用程序中可以使用AOP插入其他逻辑的点,比如方法调用、方法调用本身、类初始化、对象实例化;
通知:在特定连接点执行的代码,比如前置、后置等;
切入点:用于定义何时执行通知的连接点集合,
切面:封装在类中的通知和切入点的组合,即在什么位置执行以及执行什么逻辑;
织入:将切面在适当的位置插入到应用程序代码中的过程;
目标对象:由AOP进程修改的对象;
引入:可以通过引入AOP来任何对象实现特定接口,而无须对象的类显示地实现该接口;
静态AOP
通过修改应该程序实际字节码并根据需要更改和扩展应用程序代码来时静态AOP,
优点:修改字节码,并且在运行时无须使用任何特殊技巧来确定应该何时执行通知;
缺点:对切面所做的任何修改都要重新编译整个应用程序;
动态AOP:
织入是运行时执行的,如何实现依赖具体实现,spring采用的方法时为所有本通知对象创建代理,以便根据需要调用通知
优点:可以轻松修改应用程序的整个切面,而无须重新编译代码
缺点:性能不如AOP
spring AOP唯一限制是不能通知final类,因为它们不能被覆盖;
spring Aop:
运行时spring会分析applicationcontext中的bean定义的横切关注点,并动态生成代理bean,将调用者注入代理bean,代理bean分析运行条件并相应地织入适当的通知;
spring AOP有两种代理方式:jdk动态代理与CGlib代理,默认情况下当被通知的目标对象实现一个接口时,spring将使用jdk动态代理来创建目标的代理实例,当C被通知目标对象没有实现接口时,将使用CGlib来创建代理实例;
jdk动态代理:
只能生成接口的代理,而不能生成类的代理; 使用jdk动态代理时,所有方法调用都会被jvm拦截并路由到代理的invoke方法,然后由invoke方法确定是否通知方法,调用invoke方法前jdk代理无法区分被通知方法和未被通知方法,这意味着未被通知的方法invoke方法仍然会被调用,并仍可以使用反射进行调用;
CGlib代理:
CGlib代理会未每个代理动态生成新类的字节码,并尽可能重新已经生成的类,所有生成的代理类型将是目标类的子类;