AOP 是通过代理模式中的动态代理实现的
代理模式分为静态代理(AspectJ)、动态代理(JDK代理、GCLib代理)
问题1: 为什么需要代理模式,什么是代理模式?
同生活中的代理,客户需要完成一件事情,但自己无法完成。 需要通过代理拥有的能力来完成这件事。从而代理模式具备了2个特性,对原对象保密性和功能扩展。
问题2: 什么是AOP?
面向切面编程,它是一种编程的思想,它有很多的应用。主流是Spring AOP 和 AspectJ
问题3: 为什么需要AOP?AOP实现哪些功能?
AOP有如下功能:增强原有方法功能(日志、安全),对原有方法无侵入性(对原功能无影响)
日志记录,审计,声明式事务,安全性和缓存等方面的各种常见的的例子
问题4: AOP是怎么实现这些功能?
术语:切面Aspect、加入点Join Point、通知Advice、切入点PointCut、介绍(引用)Introduction、目标对象TargetObject、纺织Weaving
切面Aspect: 代表一个切面类,统一用来处理一类功能
切入点PointCut: 注解在方法上,实现切面的方法或一类方法
加入点JoinPoint: 通知注解的方法的参数,用于获取切面方法的参数内容
介绍(引用)Introduction: 为目标对象,引用(使用)另一个对象的方法,使用@DeclareParents实现
目标对象TargetObject: 切面方法所在的类对象,从JoinPoint.getTarget()获取到类名
通知Advice:监听方法调用,加入业务代码,有以下切入方式 before/after/after-returning/after-throwing/around
纺织Weaving:1、编译期 2 、装载期 3、运行时。使用不同的代理方式产生的区别。 Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。
问题5: 静态代理、动态代理的区别?
静态代理是在编译时,生成.class文件 动态代理是在运行时,生成.class文件 从而静态代理更快,但静态代理的代理耦合更高
问题6:JDK代理、GCLib代理、AspectJ 的区别?
JDK代理需要实现接口
GCLib不需要,通过运行生成目标类的父类
AspectJ运行不做任何操作 与 Spring AOP 不同, 它不需要任何设计模式。为了编织代码的各个方面, 它引入了称为 AspectJ 编译器 (ajc) 的编译器, 通过它编译我们的程序, 然后通过提供一个小型 (100K) 运行时库来运行它。
关于源码和实现原理可能不正确地方,谢谢指正