Vik*_*ary 2 java proxy spring spring-aop
spring是否在每次创建目标bean时创建代理对象,还是仅在第一次出现时创建代理对象Spring AOP?
编织是一种将目标类与方面交织在一起的技术,以便在出现合适的条件时执行建议。
AspectJ提供了三种编织机制,即:源编织,二进制编织和负载编织。
而Spring AOP只提供运行时编织。
源编织是编译过程的一部分,其中Java的源代码(*.java)通过AspectJ编译器(ajc)编译成编织的字节码(*.class)。在此,ajc替换javac(Java编译器)。
Target.java + MyAspect.java -- (compiled with ajc) --> Target.class
在二进制编织中,目标和方面源代码(*.java)分别编译为二进制类(.class)。然后将这些二进制类与AspectJ编译器(ajc)编织在一起。
步骤1:编译目标类
Target.java -- (compiled with javac) --> Target.class
步骤2:编译Aspect类
MyAspect.java -- (compiled with javac or ajc) --> MyAspect.class
步骤3.编织方面
Target.class + MyAspect.class -- (woven with ajc) --> Target.class
在负载编织中,二进制目标和方面类()在JVM使用诸如的技术加载类时*.class被修改(instrumented)javaagent。
由于Spring框架固有的基于代理的特性,Spring AOP仅提供运行时编织。这意味着在应用程序启动过程中(或在运行时使用它之前的任何其他时间),将目标类实例转换为代理。目标代理类将相应地拦截对目标方法的任何调用,以执行任何适当的建议。
Spring是否在每次创建目标bean时创建代理对象,还是仅在Spring AOP中第一次发生?
假设您已经在名为create的控制器的方法上创建了一个方面BookController。
BookController,并创建目标类的代理。目标类的代理仅创建一次。CglibAopProxy。否则,代理的类型为JdkDynamicAopProxy。create目标类的方法时BookController,Spring框架都会将原始代理包装在连接点内(MethodInvocationProceedingJoinPoint在这种情况下),然后再将其传递给方面。Spring AOP仅支持运行时编织,这是否意味着仅在首次调用目标方法时才创建目标代理?
当Spring AOP声明运行时时,它将尝试区分AspectJ中的其他类型的编织。Spring运行时可以表示运行Spring应用程序的任何时间。
关于何时准确创建代理的问题,可以延迟创建或主动创建。在大多数情况下,目标类在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)
| 归档时间: |
|
| 查看次数: |
1185 次 |
| 最近记录: |