Say Service 调用需要应用日志方面(注释)的 Dao 类。我想知道如何 方面实际得到应用。
根据我的理解,在Service对象下进行DAO注入时,spring发现有一些 方面(在本例中为日志记录)是为 DAO 配置的,因此它注入代理对象而不是实际的目标对象。 现在,当实际调用 DAO 内的任何方法时,代理会应用方面,然后调用实际目标 目的。那是对的吗 ?我也相信这称为运行时编织。
另一方面,可以通过加载时编织(使用 javaagent 配置)来完成同样的操作,其中字节码操作 是针对需要应用方面的类完成的。所以代理不会出现在这里。
如果我错了,请纠正我,因为这是所有 spring 模块的基础?
您的理解是正确的。 Spring AOP 是基于代理的。 Spring 使用 JDK 代理(当被代理的目标至少实现一个接口时首选)或 CGLIB 代理(如果目标对象未实现任何接口)来为给定的目标 bean 创建代理。
除非进行其他配置,否则 Spring AOP 执行运行时编织。不过,您可以设置 Spring 通过 AspectJ 进行加载时编织。检查文档链接了解更多详细信息。
参考[Spring AOP代理内部原理][2]
这里还有两点需要澄清
我帖子中的第一个实际上是加载时编织而不是运行时编织
从此链接
加载时编织 (LTW) 只是二进制编织,延迟到类加载器加载类文件并将类定义到 JVM 为止。为了支持这一点,需要一个或多个“编织类加载器”,要么由运行时环境显式提供,要么通过“编织代理”启用。
第二个是编译时编织
编译时编织是最简单的方法。当您拥有应用程序的源代码时,ajc 将从源代码进行编译并生成编织类文件作为输出。编织器的调用是 ajc 编译过程中不可或缺的一部分。方面本身可以是源代码或二进制形式。如果受影响的类需要这些方面才能编译,则必须在编译时编织。方面是必需的,例如,当它们向类添加成员并且正在编译的其他类引用添加的成员时。