弹簧方面如何在内部工作?

2022-09-03 05:55:29

假设服务调用需要应用日志记录方面(注释)的 Dao 类。我想知道各个方面是如何实际应用的。

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

另一方面,加载时间编织(使用javaagent配置)也可以完成相同的操作,其中对需要应用方面的类进行字节码操作。因此,代理在这里没有出现。

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


答案 1

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

除非配置为执行其他操作,否则 Spring AOP 将执行运行时编织。但是,您可以设置Spring以通过AspectJ进行加载时间编织。有关更多详细信息,请查看文档链接

弹簧 AOP 代理内部的参考


答案 2

这里还有两点需要澄清

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

从此链接

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

第二个是编译时编织

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


推荐