AOP工作流程
- Spring容器启动
- 读取所有切面配置中的切入点
- 初始化Bean,判定Bean对应的类中的方法是否匹配到任意切入点
- 匹配失败,创建失败
- 匹配成功,创建原始对象(目标对象)的代理对象
- 获取Bean执行方法
- 获取Bean,调用方法并执行,完成操作
- 获取的Bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作
@Component
@Aspect
public class MyAdvice{
@Pointcut("execution(void com.xxx.dao.BookDao.save())")
private void ptx(){ }
// 定义切入点
@Pointcut("execution(void com.xxx.dao.BookDao.update())")
private void pt(){ }
@Before("pt()") // 绑定切入点与通知关系
public void method(){ // 定义共性功能
System.out.println(System.currentTimeMillis());
}
}
public class App{
public static void main(String[] args){
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
System.out.println(bookDao);
System.out.println(bookDao.getClass());
}
}
AOP核心概念
- 目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
- 代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现
SpringAOP本质:代理模式