当使用 Spring AOP 为使用NameMatchMethodPointcutAdvisor和BeanNameAutoProxyCreator的类创建代理时,这实际上代理了对对象的每个调用,但仅将建议应用于匹配的方法,或者以某种方式创建一个仅具有这些方法并使用正常的代理对象应该被拦截的呼叫的对象?
方式,我想我理解它会代理对对象的每次调用,然后只在匹配的方法上调用顾问 - 但我找不到一个好的示例/帖子来确认这一点。
当使用 Spring AOP 为使用NameMatchMethodPointcutAdvisor和BeanNameAutoProxyCreator的类创建代理时,这实际上代理了对对象的每个调用,但仅将建议应用于匹配的方法,或者以某种方式创建一个仅具有这些方法并使用正常的代理对象应该被拦截的呼叫的对象?
方式,我想我理解它会代理对对象的每次调用,然后只在匹配的方法上调用顾问 - 但我找不到一个好的示例/帖子来确认这一点。
取决于使用的技术。proxy-target-class
(可以通过aop 配置中的属性进行配置)
JDK动态代理是按接口的代理 - 正如您所说,接口的每个方法都通过代理,如果它匹配恰好是“建议”方法,则应用顾问。否则它被委托给原始对象
CGLIB 代理实际上是在具体类的运行时定义的子类。我不能确定,但我假设只有“建议”的方法被覆盖,其余的保留超类的定义。
但是,无论使用哪种机制:
或者以某种方式创建一个仅具有这些方法的代理对象,并将普通对象用于应该被拦截的调用?
这实际上是如何工作的?当一个类引用被代理的类时,它只有一个引用。它要么必须调用代理类,要么必须调用非代理类。Spring 无法知道您正在调用哪些方法,因此如果您需要调用建议的方法,则无法为您提供一种类型,如果您不需要,则无法为您提供另一种类型。