簡體   English   中英

在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第一次發生代理對象?

織造

編織是一種將目標類方面交織在一起的技術,以便在出現合適的條件時執行建議。

AspectJ提供了三種編織機制,即: 源編織二進制編織負載編織

Spring AOP只提供運行時編織

編織方式

1.源編織

源編織是編譯過程的一部分,在該過程中,Java的源代碼( *.java )與AspectJ編譯器( ajc )一起被編譯成編織的字節碼( *.class )。 在此, ajc替代了javac (Java編譯器)。

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

2.二進制編織

在二進制編織中,目標和方面源代碼( *.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

3.負載編織

在負載編織中,在JVM使用諸如javaagent之類的技術加載類時,對二進制目標類和方面類( *.class )進行了修改( instrumented )。

4.運行時編織

由於Spring框架固有的基於代理的特性,Spring AOP僅提供運行時編織。 這意味着在應用程序啟動過程中(或在運行時使用它之前的任何其他時間),將目標類實例轉換為代理。 目標代理類將相應地攔截對目標方法的任何調用,以執行任何適當的建議。

問題

Spring是否在每次創建目標bean時創建代理對象,還是僅在Spring AOP中第一次發生?

假設您已經在名為BookController的控制器的名為create的方法上創建了一個方面。

  • 在應用程序啟動期間,Spring框架實例化目標bean BookController ,並創建目標類的代理。 目標類的代理僅創建一次
  • 如果目標類沒有實現任何接口,則代理的類型為CglibAopProxy 否則,代理的類型為JdkDynamicAopProxy
  • 每次調用目標類BookControllercreate方法時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM