Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring方面如何在内部工作?_Java_Spring_Aspectj_Spring Aop - Fatal编程技术网

Java Spring方面如何在内部工作?

Java Spring方面如何在内部工作?,java,spring,aspectj,spring-aop,Java,Spring,Aspectj,Spring Aop,假设服务调用需要应用日志方面(注释性)的Dao类。我想知道怎么做 方面实际上得到了应用 根据我在服务对象下进行DAO注入时的理解,spring发现存在一些问题 方面(在本例中是日志记录)是为DAO配置的,因此它注入代理对象而不是实际的目标对象。 现在,当实际调用DAO内的任何方法时,代理应用方面,然后调用实际目标 对象对吗?我也相信这就是所谓的运行时编织 另一方面,在加载时编织(使用javaagent配置)中也可以实现同样的功能,在加载时编织中可以进行字节码操作 对需要应用方面的类执行。所以代理

假设服务调用需要应用日志方面(注释性)的Dao类。我想知道怎么做 方面实际上得到了应用

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

另一方面,在加载时编织(使用javaagent配置)中也可以实现同样的功能,在加载时编织中可以进行字节码操作 对需要应用方面的类执行。所以代理并没有出现在这里


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

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

除非配置为其他方式,否则SpringAOP将执行运行时编织。不过,您可以通过AspectJ设置Spring进行加载时编织。有关更多详细信息,请查看


参考资料

这里仍有两点需要澄清

我的文章中的第一个实际上是加载时编织,而不是运行时编织

由此

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

第二个是编译时编织


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

我认为加载时编织在性能方面更好,因为在决定是否需要根据方面配置(运行时编织就是这样)注入代理时不会有性能开销。是的,在加载时,编织服务器启动将花费更长的时间,但这是一个很好的活动,在加载时间编织(或者更具体地说是编译时间编织)中,性能可能会更好。最好是通过负载测试来验证它。但是,可能还有其他领域需要考虑,比如构建系统中的更改。在生成工件之前,您应该包括这一步。这只是一句有用的引语——“计算机科学中的所有问题都可以通过另一个间接层次来解决,当然除了太多间接层次的问题。”——David Wheelergreat解释。两个Qs->第一:我们可以说SpringAOP使用反射而aspectJ不使用反射吗?第二:从效率的角度来看,使用反射不是很昂贵吗?@AmirZiarati我将尝试回答:1.两者都使用反射,但AspectJ“至少使用反射”(请参阅)2。是的,反射是昂贵的,应该小心使用。