Spring方面如何在内部工作?

时间:2014-12-20 14:05:01

标签: java spring aspectj spring-aop

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

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

另一方面,可以使用加载时间编织(使用javaagent配置)进行字节代码操作 适用于需要应用方面的类。所以代理不会在这里形成。

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

2 个答案:

答案 0 :(得分:12)

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

除非另有配置,否则Spring AOP会执行运行时编织。但是,您可以设置Spring通过AspectJ进行加载时编织。查看documentation link了解详情。

Spring AOP proxying internals

的参考

答案 1 :(得分:2)

这里有两点要澄清

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

从此link

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

第二个是编译时编织

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