2015-01-16 22 views
40

Jestem ciekawa, w jaki sposób wtrysk sprężynowy obsługuje metody wywoływania z adnotacją @Bean. Jeśli wstawię adnotację @Bean dla metody i zwrócę instancję, rozumiem, że to mówi sprężynie, aby utworzyć komponent bean, wywołując metodę i pobierając zwróconą instancję. Czasami jednak ta fasola musi być użyta do podłączenia innych ziaren lub ustawienia innego kodu. Najczęstszym sposobem jest wywołanie metody o adnotacji @Bean, aby uzyskać instancję. Moje pytanie brzmi: dlaczego to nie powoduje, że wiele kuli się unosi?Wywołanie metody z adnotacją @Bean w konfiguracji Spring java

Na przykład zobacz poniższy kod (wzięty z innego pytania). Metoda entryPoint() jest opisana przez @Bean, więc wyobrażam sobie, że wiosna stworzy nowe wystąpienie BasicAuthenticationEntryPoint jako komponentu bean. Następnie ponownie wywołujemy entryPoint() w bloku konfiguracyjnym, ale wygląda na to, że entryPoint() zwraca instancję komponentu bean i nie jest wywoływana wiele razy (próbowałem się zalogować i otrzymałem tylko jeden wpis dziennika). Potencjalnie moglibyśmy wielokrotnie wywoływać entryPoint() w innych częściach konfiguracji, a my zawsze otrzymalibyśmy to samo wystąpienie. Czy moje zrozumienie tego jest poprawne? Czy wiosna pozwala na magiczne przepisanie metod opisanych w @Bean?

@Bean 
public BasicAuthenticationEntryPoint entryPoint() { 
    BasicAuthenticationEntryPoint basicAuthEntryPoint = new BasicAuthenticationEntryPoint(); 
    basicAuthEntryPoint.setRealmName("My Realm"); 
    return basicAuthEntryPoint; 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http 
     .exceptionHandling() 
      .authenticationEntryPoint(entryPoint()) 
      .and() 
     .authorizeUrls() 
      .anyRequest().authenticated() 
      .and() 
     .httpBasic();  
} 

Odpowiedz

61

Tak, wiosna robi kilka magia. Sprawdzić Spring Docs:

@Configuration Wszystkie zajęcia są podklasy w czasie uruchamiania z CGLIB. W podklasie metoda podrzędna najpierw sprawdza kontener przed zbuforowanymi (zakreślonymi) komponentami bean, zanim wywoła metodę macierzystą i utworzy nową instancję.

Oznacza to, że te rozmowy do @Bean metod są przekierowywane przez CGLIB i dlatego buforowane wersja fasoli jest zwracana (nowy jeden nie jest tworzony).

Domyślny zakres @Bean s to SINGLETON, jeśli zostanie określony inny zakres, na przykład PROTOTYPE, połączenie zostanie przekazane do oryginalnej metody.

+0

Czy można zastąpić fasolę utworzoną w ten sposób? Na przykład mam klasy zdefiniowanej Spring, który bezpośrednio wywołuje metodę tworzenia bean. Czego chcę, to to, że nie używa się fasoli stworzonej przez tę metodę, ale definiuję siebie (poprzez adnotację jej za pomocą '@ Bean' i' @ Primary'). – Fons

Powiązane problemy