当使用 Spring AOP 为使用 NameMatchMethodPointcutAdvisor 的类创建代理时和 BeanNameAutoProxyCreator这是否实质上代理了对该对象的每次调用,但仅将建议应用于匹配的方法,或者以某种方式创建一个仅具有这些方法并使用普通对象进行应该被拦截的调用的 Proxied 对象?
我想我的理解是,它确实代理了对对象的每次调用,但随后仅在匹配的方法上调用 Advisor - 但我找不到好的示例/帖子来证实这一点。
最佳答案
取决于所使用的技术。 (它可以通过 aop 配置中的属性 proxy-target-class
进行配置)
JDK 动态代理是接口(interface)代理 - 正如您所说,接口(interface)的每个方法都通过代理,如果匹配恰好是“建议”方法,则应用顾问程序。否则委托(delegate)给原对象
CGLIB 代理实际上是在具体类的运行时定义的子类。我不能确定这一点,但我假设只有“建议的”方法被覆盖,其余的保留父类(super class)的定义。
但是,无论使用哪种机制:
- 您不关心代理是如何实现的
- 这不会显着影响性能 - Debunking myths: proxies impact performance Spring 团队关于代理性能的迷思
关于java - 使用 Spring AOP 时是否代理了所有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299185/