2016-04-15 5 views
1

I Frühling lerne :)Proxy-Muster durch die Feder verwendet

ich folgende Zweifel haben,

  1. Does Feder für jede Bohne Proxy-Objekt erstellt, auch wenn ich nicht Anmerkungen zum Beispiel @Transactional verwendet haben, die ich denke, brauche Proxy.
  2. las ich folgendes in spring documentation

Beachten Sie, dass @Bean Methoden zur statischen Aufruf wird nie durch den Behälter abgefangen bekommen, nicht einmal innerhalb @Configuration Klassen (siehe oben). Dies liegt an technischen Einschränkungen: CGLIB-Unterklassen können nur nicht statische Methoden überschreiben. Als Konsequenz wird ein direkter Aufruf einer anderen @Bean-Methode eine Standard-Java-Semantik haben, was dazu führt, dass eine unabhängige Instanz direkt von der Factory-Methode selbst zurückgegeben wird.

a. Spring gibt das Proxy-Objekt im folgenden Beispiel wegen der statischen Methode, die nicht überschrieben werden kann, nicht zurück. So wird hier Originalobjekt zurückgegeben. Habe ich recht?

@Configuration 
    public class Config { 
     @Bean 
     public static Student student() { 
      return new Student(); 
     } 
    } 

b. Bedeutung von "Beachten Sie, dass Aufrufe von statischen @Bean-Methoden niemals vom Container abgefangen werden, auch nicht innerhalb von @Configuration-Klassen"

Antwort

1

a. Ja du hast Recht. Sie erhalten das ursprüngliche Objekt.

b. Die Methode student() befindet sich in der Klasse Config, die mit Annotation @Configuration versehen ist. Alle Methoden, die mit der Klasse @Bean inside @Configuration versehen sind, werden im Frühling durch die Erstellung von Proxies abgefangen. Da Ihre Methode statisch ist und sich innerhalb der Config-Klasse befindet, wird sie von Spring nicht abgefangen, und es werden keine Proxys erstellt.

+0

Und Antwort für Q 1. ist Frühling schafft Proxy für jede Bean und verwendet jdk Schnittstelle Proxy dafür? –

+1

Ja, im Frühling wird Proxy für jede Bohne erstellt, wenn der Lebenszyklus vom Frühling gesteuert wird. Und Spring wird JDK-basierte Proxies verwenden, wenn Ihre Spring Bean-Klasse eine der Schnittstellen erweitert. Wenn es keine Schnittstelle erweitert, verwendet es CGLIB-basierte Proxies. – asg

Verwandte Themen