Spring中的代理

2022-06-30 14:35:41

Spring中有两种类型的代理:使用 JDK Proxy 类创建的 JDK 代理以及使用 DDLIB Enhancer 类创建的基于 CGLIB 的代理。

代理的核心目标是拦截方法的调用,并在必要时执行适用于特定方法的通知链。通知的管理和调用基本上是独立于代理的,由 Spring AOP 框架管理。而代理主要负责拦截对所有方法的调用,并将它们根据需要传递给 AOP 框架,以便应用通知。此外,代理还必须支持一组附加功能,即可以通过 AopContext 类(这是一个抽象类)配置代理以公开自己,以便可以检索代理并从目标对象调用代理上的被通知方法。当通过 ProxyFactory.setExposeProxy( )启用该功能时,代理负责确保代理类被适当地公开。另外,所有代理类默认实现 Advised 接口,从而允许在创建代理之后更改通知链。代理还必须确保任何返回代理类(即返回代理目标)的方法实际上返回的是代理而不是目标。

在这里插入图片描述

1、JDK代理
JDK 代理是 Spring中最基本的代理,与 CGLIB 代理不同,jdj代理只能生成接口的代理,而不能生成类的代理。这样一来,想要代理的任何对象都必须至少实现一个接口。并且生成的代理将是实现该接口的对象。
一般来说,为类使用接口是一种很好的设计,但并不总是可行的。尤其是当使用第三方或旧代码时,在这种情况下必须使用 CDLIB 代理。当使用 JDK 代理时,所有方法调用都会被 JVM 拦截,并路由到代理的invoke( )方法。然后由invoke( )方法确定是否通过有关方法(根据由切入点定义的规则),如果确定想要通知,则通过使用反射调用通知链,然后调用方法本身。
在调用invoke( )方法之前,JDK 代理无法区分被通知方法和未被通知方法。这意味着对于代理上的未被通知方法,invoke( )方法仍会被调用。所有检查仍然会执行,并且仍然可以通过使用反射进行调用。显然,每次调用方法时都会导致运行时开销。即使代理不会执行额外的处理,而只是通过反射调用未被通知的方法。

  • 作者:小蜗牛慢跑
  • 原文链接:https://blog.csdn.net/weixin_43232662/article/details/108555935
    更新时间:2022-06-30 14:35:41