由于AOP是基于Spring容器管理的bean做的增强,所以整个工作过程需要从Spring加载bean说起:
流程1:Spring容器启动
容器启动就需要去加载bean,哪些类需要被加载呢?
需要被增强的类,如:BookServiceImpl
通知类,如:MyAdvice
注意此时bean对象还没有创建成功
流程2:读取所有切面配置中的切入点
上面这个例子中有两个切入点的配置,但是第一个ptx()并没有被使用,所以不会被读取,只会读取使用了的切入点pt()。
流程3:初始化bean
判定bean对应的类中的方法是否匹配到任意切入点
注意第1步在容器启动的时候,bean对象还没有被创建成功。
要被实例化bean对象的类中的方法和切入点进行匹配
匹配失败,创建原始对象,如UserDao
匹配失败说明不需要增强,直接调用原始对象的方法即可。
匹配成功,创建原始对象(目标对象)的代理对象,如: BookDao
匹配成功说明需要对其进行增强
对哪个类做增强,这个类对应的对象就叫做目标对象
因为要对目标对象进行功能增强,而采用的技术是动态代理,所以会为其创建一个代理对象
最终运行的是代理对象的方法,在该方法中会对原始方法进行功能增强
流程4:获取bean执行方法
获取的bean是原始对象时,调用方法并执行,完成操作。
获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作。