AOP工作流程

  1. Spring容器启动
  2. 读取所有切面配置中的切入点
  3. 初始化Bean,判定Bean对应的类中的方法是否匹配到任意切入点
    • 匹配失败,创建失败
    • 匹配成功,创建原始对象(目标对象)的代理对象
  4. 获取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本质:代理模式