假设Service调用需要应用日志记录方面(注释性)的Dao类。我想知道aspects实际上是如何应用的。
根据我在服务对象下注入DAO时的理解,spring发现有一些方面(在本例中为日志记录)是为DAO配置的,因此它注入代理对象而不是实际的目标对象。现在,当实际调用DAO中的任何方法时,代理应用方面,然后调用实际的目标对象。对吗?另外,我认为这就是所谓的运行时编织。
另一方面,加载时编织(使用javaagent配置)也可以做到这一点,其中对需要应用方面的类执行字节码操作。因此,proxy不会出现在这里。
如果我错了,请纠正我,因为这是所有弹簧模块的基础?
发布于 2014-12-20 22:37:52
你的理解是对的。Spring AOP是基于代理的。Spring使用JDK代理(当被代理的目标实现至少一个接口时首选)或CGLIB代理(如果目标对象没有实现任何接口)为给定的目标bean创建代理。
除非配置为其他方式,否则Spring AOP将执行运行时编织。但是,您可以将Spring设置为通过AspectJ执行加载时编织。有关更多详细信息,请查看documentation link。
Spring AOP proxying internals参考
发布于 2015-12-23 02:13:59
这里还有两点需要澄清
我的帖子中的第一个实际上是加载时编织,而不是运行时编织
从这个link
JVM加载时编织(LTW)是简单的二进制编织,直到类加载器加载类文件并向定义类。为了支持这一点,需要一个或多个“编织类加载器”,要么由运行时环境显式提供,要么通过“编织代理”启用。
第二个是编译时编织
编译时编织是最简单的方法。当您有了应用程序的源代码时,ajc将从源代码编译并生成编织类文件作为输出。weaver的调用是ajc编译过程中不可或缺的。方面本身可以是源代码或二进制形式。如果方面是编译受影响的类所必需的,那么您必须在编译时编织。方面是必需的,例如,当它们将成员添加到类并且正在编译的其他类引用所添加的成员时。
https://stackoverflow.com/questions/27580958
复制相似问题