繁体   English   中英

Spring方面如何在内部工作?

[英]How Spring aspects work internally?

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

根据我在服务对象下注入DAO时的理解,spring发现有一些方面(在这种情况下是日志记录)是为DAO配置的,因此它会注入代理对象而不是实际的目标对象。 现在,当对DAO中的任何方法进行实际调用时,代理应用方面,然后调用实际的目标对象。 那是对的吗 ? 另外我相信这叫做跑步编织。

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

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

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

除非另有配置,否则Spring AOP会执行运行时编织。 但是,您可以设置Spring通过AspectJ进行加载时编织。 有关详细信息,请查看文档链接

Spring AOP代理内部参考

这里还有两点需要澄清

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

从这个链接

加载时间编织(LTW)简单地是二进制编织,直到类加载器加载类文件并将类定义到JVM。 为了支持这一点,需要一个或多个“编织类加载器”,它们由运行时环境明确提供或通过“编织代理”启用。

第二个是编译时编织

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM