[英]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
第一次發生代理對象?
編織是一種將目標類與方面交織在一起的技術,以便在出現合適的條件時執行建議。
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使用諸如javaagent
之類的技術加載類時,對二進制目標類和方面類( *.class
)進行了修改( instrumented
)。
由於Spring框架固有的基於代理的特性,Spring AOP僅提供運行時編織。 這意味着在應用程序啟動過程中(或在運行時使用它之前的任何其他時間),將目標類實例轉換為代理。 目標代理類將相應地攔截對目標方法的任何調用,以執行任何適當的建議。
Spring是否在每次創建目標bean時創建代理對象,還是僅在Spring AOP中第一次發生?
假設您已經在名為BookController
的控制器的名為create
的方法上創建了一個方面。
BookController
,並創建目標類的代理。 目標類的代理僅創建一次 。 CglibAopProxy
。 否則,代理的類型為JdkDynamicAopProxy
。 BookController
的create
方法時,Spring框架都會將原始代理包裝在連接點(在本例中為MethodInvocationProceedingJoinPoint
)內, BookController
方面。 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.