问:Spring AOP底层实现原理
答:AOP底层是采用动态代理机制实现的:接口+实现类。
当要代理的是某个接口的实现类,Spring AOP会使用JDK Proxy,去创建代理对象。
不是接口的实现类无法使用JDK Proxy进行代理了,Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。
即通过代理的方式创建一个和impl实现类平级的一个对象,该对象不是一个真正意义上的对象,只是一个代理对象,但它可以实现和impl相同的功能。这个就是AOP的横向机制原理,这样就不需要修改源代码。
问:Aop概念
在程序中具有公共特性的某些类/某些方法上进行拦截, 在方法执行的前面/后面/执行结果返回后增加执行一些方法。
银行取款流程和查询余额流程如下所示:
这个两者有一个相同的验证流程如果有更多的操作,验证用户的功能是不是需要写很多次;
AOP可以在写代码时不需要把验证用户的步骤写进去,完全不考虑验证用户,你写完之后,在另外一个地方,写好验证用户的代码,然后告诉Spring你要把这段代码加到哪几个地方,Spring就会帮你加过去,而不要你自己Copy过去。AOP的本质是在一系列纵向的控制流程中,把那些相同的子流程提取成一个横向的面。
问:Aop关键名词
目标对象(Target):
目标对象是指要被增强的对象,即包含主业务逻辑的对象。
连接点(JoinPoint):
程序运行的某一个点,比如某个执行方法,在springAop中join point总是表示一个方法的执行。连接点表示方法的调用过程,内部包含了方法调用过程中的所有信息,比如被调用的方法、目标、代理对象、执行拦截器链等信息。
代理对象(Proxy):
Aop 会通过代理的方式,对目标对象生成一个代理对象,代理对象中会加入需要增强的功能,通过代理对象来间接的方式到目标对象上,起到增强目标对象的效果。
通知(Advice):
需要在目标对象中增强的功能,如:业务方法前验证用户的功能、方法执行之后打印方法的执行日志。通知中有2个重要的信息:方法的什么地方,执行什么操作,这2个信息通过通知来指定。方法的什么地方?之前、之后、包裹目标方法、方法抛出异常后等。
拦截器链
一个目标方法中可以添加很多Advice,这些Advice最终都会被转换为MethodInterceptor(连接点接口)类型的方法拦截器,最终会有多个MethodInterceptor ,这些MethodInterceptor 会组成一个方法调用链。
Aop内部会给目标对象创建一个代理,代理对象中会放入这些MethodInterceptor 会组成一个方法调用链,当调用代理对象的方法的时候,会按顺序执行这些方法调用链,一个个执行,最后会通过反射再去调用目标方法,进而对目标方法进行增强。
切入点(Pointcut):
用了指定需要将通知使用到那些地方,比如需要用在哪些类的那些方法上。
切面(Aspect):
通知(advice)和切入点(Pointcut)的组合,切面定义在那些地方(Pointcut)执行什么操作(Advice);
顾问(Advisor):
Pointcut和Advice的组合,Advice是要增强的逻辑,而增强的逻辑要在什么地方执行就是通过Pointcut来指定,所以advice必须与Pointcut组合在一起。
问:有哪些类型的通知(Advice)
Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用@Before 注解标记进行 配 置 。
After Returning - 这 些 类 型 的 Advice 在 连 接 点 方 法 正 常 执 行 后 执 行 , 并 使 用 @AfterReturning 注 解 标 记 进 行 配 置 。
After Throwing - 这 些 类 型 的 Advice 仅 在 joinpoint 方 法 通 过 抛 出 异 常 退 出 并 使 用 @AfterThrowing 注 解 标 记 配 置 时 执 行 。
After (finally) - 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回, 并使用 @After 注解标记进行配置。
Around - 这些类型的 Advice 在连接点之前和之后执行,并使用@Around 注解标记进行配置。
注:相关问题只是了解,后续深入会继续补充。