【Spring】AOP工作流程
前言:
AOP(Aspect Oriented Programming)面向切面编程:一种编程范式,指导开发者如何组织程序结构。
AOP作用:在不惊动原始设计的基础上为其进行功能增强。
- 由于AOP是基于Spring容器管理的bean做的增强,所以整个工作过程需要从Spring加载bean说起:
流程1:Spring容器启动
- 容器启动就需要去加载bean
- 需要被增强的类,如:BookServiceImpl
- 通知类,如:MyAdvice
- 注意此时bean对象还没有创建成功
流程2:读取所有切面配置中的切入点
- 上面这个例子中有两个切入点的配置,但是第一个pt2()并没有被使用,所以不会被读取。
流程3:初始化bean
判定bean对应的类中的方法是否匹配到任意切入点
- 注意第1步在容器启动的时候,bean对象还没有被创建成功。
- 要被实例化bean对象的类中的方法和切入点进行匹配
匹配失败,创建原始对象,如UserDao:
- 匹配失败说明不需要增强,直接调用原始对象的方法即可。
匹配成功,创建原始对象(目标对象)的代理对象,如:BookDao
- 匹配成功说明需要对其进行增强
- 对哪个类做增强,这个类对应的对象就叫做目标对象
- 因为要对目标对象进行功能增强,而采用的技术是动态代理,所以会为其创建一个代理对象最终运行的是代理对象的方法,在该方法中会对原始方法进行功能增强
流程4:获取bean执行方法
- 获取的bean是原始对象时,调用方法并执行,完成操作
- 获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作
5、验证容器中是否为代理对象
- 如果目标对象中的方法会被增强,那么容器中将存入的是目标对象的代理对象
- 如果目标对象中的方法不被增强,那么容器中将存入的是目标对象本身。
1)、创建一个测试类
package com.itheima;
import com.itheima.config.SpringConfig;
import com.itheima.dao.BookDao;
import com.itheima.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
UserDao userDao = ctx.getBean(UserDao.class);
System.out.println("bookDao :" + bookDao.getClass());
System.out.println("userDao :" + userDao.getClass());
}
}
2)、测试结果:
结论:
- 由于BookDao类中save()的方法和切入点匹配成功,所以容器中的对象应该是的代理对象。
- 而UserDao类中save()的方法和切入点匹配失败,所以容器中的对象应该是的原始对象。