"有一种 Spring 代理可以替换方法返回的对象"是什么意思?



我正在做一个模拟考试,我不太明白其中一个答案,没有解释为什么它是正确的。

(由kriegaex从这里向下编辑,添加以下评论中的问题以及一些格式和改写,以使文本更加连贯和可读。

  • 问题:关于 Spring 的代理功能,以下哪项陈述是正确的?
  • 答:">有一种 Spring 代理可以替换该方法返回的对象。

我知道Spring AOP可以使用两种类型的代理:

  • JDK 动态代理
  • CGLIB 代理

据我了解,这是 Spring 中大量使用的两种代理类型。例如,在使用@Transactional或创建方面(@Aspect(时。

我对给出的答案的理解是,他们指向@Around方面。但是,我不明白为什么他们称其为"弹簧代理类型"。一个方面是代理吗?因此,我对使用 JDK 或 CGLIB 代理的方面的理解不正确吗?

如果您提供了所有可能的答案,也提供了不正确的答案,这个问题会更容易理解。但是给定正确的一个(听起来确实很奇怪(,我可以告诉你以下内容:

  • JDK 和 CGLIB 代理都有相同的目的:包装和替换原始对象,以便能够通过 Spring AOP 或其他方法将一些拦截器注册到它们的方法调用中。
  • 是的,这两种代理类型在 Spring 中都被大量使用,JDK 代理用于实现接口的类,CGLIB 代理用于不实现任何接口的类。或者,您可以将 Spring 配置为将 CGLIB 代理也用于接口类型。
  • 没有"@Around方面"这样的东西,只有@Around建议类型(除了其他建议类型,例如@Before@After(。
  • 不,方面不是代理。但是Spring AOP使用代理来实现通过委托模式执行AOP的方式,而不是AspectJ不使用任何代理,而是使用直接字节码检测来实现其目标。

在 Spring 文档中查找更多信息。

最新更新