在 Spring AOP 中,spring 是在每次创建目标 bean 时都创建代理对象,还是仅在第一次创建时创建代理对象?

In Spring AOP, does spring creates proxy object every time a target bean is created or it happens only first time?

spring 是在每次创建目标 bean 时都创建代理对象,还是仅在 Spring AOP 中第一次发生?

编织

Weaving 是一种将 target classesaspects 交织在一起的技术,以便在合适的条件下执行建议出现。

AspectJ提供了三种编织机制,分别是:源编织二进制编织 , 和 加载编织

虽然 Spring AOP 仅提供 运行时织入.

编织类型

1。源织

源编织是编译过程的一部分,其中 Java 源代码 (*.java) 使用 AspectJ 编译器 (ajc) 编译成编织字节码 (*.class).此处,ajc 替换 javac(Java 编译器)。

Target.java + MyAspect.java -- (compiled with ajc) --> Target.class

2。二进制编织

在二进制编织中,目标和方面源代码(*.java)分别编译成二进制classes(.class)。然后将二进制 classes 与 AspectJ 编译器 (ajc) 编织在一起。

第 1 步:编译目标 class

Target.java -- (compiled with javac) --> Target.class

第 2 步:编译方面 class

MyAspect.java -- (compiled with javac or ajc) --> MyAspect.class

第 3 步。方面编织

Target.class + MyAspect.class -- (woven with ajc) --> Target.class

3。负载编织

在加载编织中,二进制目标和方面 classes (*.class) 在 JVM 加载 classes 期间被修改 (instrumented) javaagent.

等技术

4。运行时编织

由于 Spring 框架固有的基于代理的特性,Spring AOP 仅提供运行时织入。这意味着目标 class 实例在应用程序启动期间(或在运行期间使用之前的任何其他时间)更改为代理。目标代理相应地拦截对目标方法的任何调用 classes 以执行任何合适的建议。

问题

Does Spring creates proxy object every time a target bean is created or it happens only the first time in Spring AOP?

假设您已经在名为 BookController 的控制器的名为 create 的方法上创建了一个方面。

  • 在应用程序启动期间,Spring 框架实例化目标 bean BookController,并创建目标 class 的代理。 目标 class 的代理仅创建一次
  • 如果目标 class 没有实现任何接口,则代理的类型为 CglibAopProxy。否则,代理的类型为 JdkDynamicAopProxy.
  • 每次调用目标 class、BookControllercreate 方法时,Spring 框架将原始代理包装在一个连接点内(MethodInvocationProceedingJoinPoint 在这种情况下)将其传递给您的方面。

Spring AOP supports run-time weaving only, does that mean the target proxy gets created only when the target method is called for the first time?

当Spring AOP 声明运行时时,它试图区分 AspectJ 中其他类型的编织。 Spring 运行时可能意味着任何时间,而 Spring 应用程序是 运行。

关于什么时候创建代理的问题,可以惰性创建也可以主动创建。在大多数情况下,目标 classes 在 Spring 应用程序启动期间被代理。

在上面的示例中,甚至在调用控制器上的任何方法之前,即在控制台中记录底线之前,控制器实例就变成了代理。

2017-11-07 20:12:27.541 INFO 31394 --- [ main] com.basaki.Application : Started Application in 147.808 seconds (JVM running for 149.184)