SpringAOP之个人理解

在这里插入图片描述

1.什么是Spring AOP?

​ 影视明星都有助理,明星最重要的事是参加各种影视剧集的演出以及出席各种活动,其他事不用关注,谈合作、片酬等这些事统统交给助理去做;
​ 有一天, 明星退出娱乐圈了,就和这个助理和平分手了。
​ 这就是AOP,每个人各司其职灵活组合,达到一种可配置的可插拔的程序结构。
​ AOP的实现原理就是代理模式,在程序中也是如此,通过代理,可以详细控制访问某个或者某类对象的方法,在调用这个方法钱做前置处理,调用这个方法后做后置处理

2.什么是代理模式?

​ 代理模式的核心作用就是通过代理,控制对象的访问。它的设计思路是:定义一个抽象角色,让代理角色真实角色分别去实现它。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。它只关注真正的业务逻辑,比如明星参演电影。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并在前后可以附加自己的操作,比如谈合同,收钱等这就是代理模式的设计思路。

代理模式分为静态代理动态代理静态代理是我们自己创建一个代理类,而动态代理程序自己帮我们生成一个代理,我们不用管。

3.动态代理的模式

  • 动态代理一般有两种方式:JDK动态代理CJLIB动态代理
  • JDK动态代理:Proxy.newProxyInstance()方法,该方法接收三个参数
    第一个参数指定当前目标对象使用的类加载器,获取加载器的方法是固定的
    第二个参数指定目标对象实现的接口的类型
    第三个参数指定动态处理器,执行目标对象的方法时,会触发事件处理器的方法
  1. JDK 动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
  2. 但是 JDK 动态代理有个缺憾,或者说特点:JDK 实现动态代理需要实现类通过接口定义业务方法。也就是说它始终无法摆脱仅支持 interface 代理的桎梏,因为它的设计就注定了这个遗憾。
  • CGLIB 动态代理:
    • CGLIB 采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
    • 因为采用的是继承,所以不能对final修饰的类进行代理。
    • 使用 CGLIB 需要实现 MethodInterceptor 接口,并重写intercept 方法,在该方法中对原始要执行的方法前后做增强处理。
    • CGLIB 创建的动态代理对象比 JDK 创建的动态代理对象的性能更高,但是 CGLIB 创建代理对象时所花费的时间却比 JDK 多得多
    • 所以对于单例的对象,因为无需频繁创建对象,用 CGLIB 合适,反之使用JDK方式要更为合适一些。同时由于 CGLIB 由于是采用动态创建子类的方法,对于final修饰的方法无法进行代理。

4.Spring AOP 采用哪种代理

  • ​ JDK 动态代理和 CGLIB 动态代理均是实现 Spring AOP 的基础。
  • 而且是否使用 CGLIB 是在代码中进行判断的,判断条件是config.isOptimize()config.isProxyTargetClass()hasNoUserSuppliedProxyInterfaces(config)
  • hasNoUserSuppliedProxyInterfaces(config)就是在判断代理的对象是否有实现接口有实现接口的话直接走JDK 分支,即使用 JDK 的动态代理。
  • 如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理实现 AOP;如果目标对象没有实现了接口,则采用 CGLIB 库,Spring 会自动在 JDK 动态代理和 CGLIB 动态代理之间转换。

猜你喜欢

转载自blog.csdn.net/Greenarrow961224/article/details/115389834