- AOP的几个成员
- 代理模式
- Spring Aop的成员
- pointcut
- spring Aop的Advice(Introduction将单独讲)
- spring aop的Aspect(将Pointcut和advice装在一起的箱子Advisor)
- Spring aop的织入
- TargetSource(目标对象的容器)
- Aspect中注解的本质
- AOP的小陷阱
AOP的几个成员
JoinPoint
公民之Pointcut
就是表达JoinPoint的公式
公民之Advice(横切逻辑的载体)
Before Advice
After Advice(有三种)

Around Advice

Introduction(**不是根据执行时间来分的,根据完成的功能来分的)


公民之Aspect(就是把切点和加入的逻辑模块化封装起来)

织入和织入器
我们有了Aspect(切面之后),要把增强逻辑放到指定的pointcut上,这个过程就叫做织入,完成这个过程的工具就叫织入器。
目标对象

代理模式
介绍代理模式
静态代理

动态代理
jdk动态代理

cglib动态代理

Spring Aop的成员
pointcut
Pointcut的结构图(针对MethodMatcher)

Pointcut的介绍

几个常见的Pointcut实现
NameMatchMethodPointcut

JdkRegexpMethodPointcut

AnnotationMatchingPointcut

ComposablePointcut

ControlFlowPointcut(最特殊)

自定义Pointcut


ioc中的PointCut

spring Aop的Advice(Introduction将单独讲)
结构图(图中列出的都是per-class类型的Advice)

per-class类型的Advice
Advice实例能在所有目标对象类中共享,通常只拦截方法,不会为目标对象添加新特性或者保留一些状态
Before Advice

After Advice
ThrowsAdvice
AfterReturning Advice

AroundAdvice
per-instance类型的advice(introduction)
不会在目标类所有对象实例之间共享,为不同的实例对象保存不同的状态和特性。目标对象的代理对象就会具有新的行为
Introduction的结构图

Introduction之静态分支IntroductionInfo
DelegatingIntroductionInterceptor(假的Introduction)

DelegatePerTargetObjectIntroductionInterceptor(真正意义上的IntroductionAdvice)

spring aop的Aspect(将Pointcut和advice装在一起的箱子Advisor)
两类Advisor
PointcutAdvisor
结构图

DefaultPointcutAdvisor(最常用的,所有Pointcut和除Introduction的Advice都可以)
使用实例:
- 编码形式

- 容器注册形式

NameMatchMethodPointcutAdvisor(要求Pointcut是NameMatchMethodPointcut,Advice要求不是Introduction)
使用示例:
- 编码方式


注意:调用setMappedName()或者setMappedNames()底层调用的其实是内部持有的NameMatchMethodPointcut.setMappedName()或者setMappedNames()。
- 容器方式

RegexpMethodPointcutAdvisor(Pointcut只能是正则表达式,Advice是除Introduction的所有)
内部Pointcut的类型—正则表达式


使用示例(ioc注册)

DefaultBeanFactoryPointcutAdvisor(用的很少)

IntroductionAdvisor
特点
只能进行类级别的拦截,并且Advice只能是Introduction,为Introduction特定的
结构图

DefaultIntroductionAdvisor(另外一个后面介绍)

Spring aop的织入
最基本的织入器ProxyFactory,生产代理对象
使用示例


基于接口生成代理对象

基于子类生成代理对象

两个参数改变类的代理方式
- 设置代理类的class

- optimize设置为true

Introduction的织入

ProxyFactory的本质
AopProxyFactory的结构图

AopProxyFactory:
AopProxy:
AopProxyFactory的实现原理
子类DefaultAopProxyFactory(根据AdvisedSupport实例config 或者 判断有无实现接口来考虑使用jdk动态代理)

AdvisedSupport(根据这个来判断用哪种方式创建代理对象,生成代理对象所需要的信息的载体)
结构图(图中可得出,承载的信息主要分两类)
ProxyConfig—-将要生成的代理对象的控制信息

Advised—-将要生成的代理对象的必要信息


ProxyFactory的结构图

ProxyFactory的几个兄弟

ioc容器中的织入器—-ProxyFactory的兄弟之ProxyFactoryBean
ProxyFactoryBean的本质

ioc容器中的织入器—-ProxyFactory的兄弟之AspectJProxyFactory
通过编程方式织入

自动装配方式织入入

加速织入过程(自动代理,基于ApplicationContext)
实现原理

自动代理的实现类(AutoProxyCreator)
结构图
BeanNameAutoProxyCreator




DefaultAdvisorAutoProxyCreator




TargetSource(目标对象的容器)
介绍

可用的TargetSource实现类
SingletonTargetSource


prototypeTargetSource

HotSwappableTagetSource(可以用来换数据源)



CommonsPoolTagetSource

ThreadLocalTagetSource

Aspect中注解的本质
@Pointcut本质
本质:@pointcut通过解析最终会转换成面向Aspectj的Pointcut具体实现—->AspectJExpressionPointcut(属于Spring Aop中pointcut的子类)
AOP的小陷阱
场景再现

原因分析

解决办法

