Spring 方面在内部如何工作?

问题描述 投票:0回答:2

Say Service 调用需要应用日志方面(注释)的 Dao 类。我想知道如何 方面实际得到应用。

根据我的理解,在Service对象下进行DAO注入时,spring发现有一些 方面(在本例中为日志记录)是为 DAO 配置的,因此它注入代理对象而不是实际的目标对象。 现在,当实际调用 DAO 内的任何方法时,代理会应用方面,然后调用实际目标 目的。那是对的吗 ?我也相信这称为运行时编织。

另一方面,可以通过加载时编织(使用 javaagent 配置)来完成同样的操作,其中字节码操作 是针对需要应用方面的类完成的。所以代理不会出现在这里。

如果我错了,请纠正我,因为这是所有 spring 模块的基础?

java spring aspectj spring-aop
2个回答
20
投票

您的理解是正确的。 Spring AOP 是基于代理的。 Spring 使用 JDK 代理(当被代理的目标至少实现一个接口时首选)或 CGLIB 代理(如果目标对象未实现任何接口)来为给定的目标 bean 创建代理。

除非进行其他配置,否则 Spring AOP 执行运行时编织。不过,您可以设置 Spring 通过 AspectJ 进行加载时编织。检查文档链接了解更多详细信息。

参考[Spring AOP代理内部原理][2]


4
投票

这里还有两点需要澄清

我帖子中的第一个实际上是加载时编织而不是运行时编织

从此链接

加载时编织 (LTW) 只是二进制编织,延迟到类加载器加载类文件并将类定义到 JVM 为止。为了支持这一点,需要一个或多个“编织类加载器”,要么由运行时环境显式提供,要么通过“编织代理”启用。

第二个是编译时编织

编译时编织是最简单的方法。当您拥有应用程序的源代码时,ajc 将从源代码进行编译并生成编织类文件作为输出。编织器的调用是 ajc 编译过程中不可或缺的一部分。方面本身可以是源代码或二进制形式。如果受影响的类需要这些方面才能编译,则必须在编译时编织。方面是必需的,例如,当它们向类添加成员并且正在编译的其他类引用添加的成员时。

© www.soinside.com 2019 - 2024. All rights reserved.