2015-01-16 14 views
40

Yay enjeksiyonunun, @Bean ek açıklamalarıyla çağrı yöntemlerini işleme şeklini merak ediyorum. Bir yönteme @Bean ek açıklaması koyar ve bir örnek döndürürsem, bu yöntemin çağrılıp döndürülmüş örneğini alıp bir fasülyenin oluşturulması için yayı anlattığını anlıyorum. Bununla birlikte, bazen fasülyenin diğer fasulyeleri bağlamak veya başka bir kod kurmak için kullanılması gerekir. Her zamanki yol, bir örnek almak için @Bean açıklamalı yöntemini çağırmaktır. Benim sorum şu, neden bu fasülyenin etrafında yüzen birden çok örneği var? Örneğin, aşağıdaki koda bakın (başka bir sorudan alınmıştır). entryPoint() yönteminin @Bean ile açıklaması açıklanmıştır, bu nedenle yayın yeni bir BasicAuthenticationEntryPoint örneğini fasulye olarak oluşturacaktır. Ardından, yapılandırma bloğunda entryPoint()'u tekrar ararız, ancak entryPoint() fasulye örneğini döndürür ve birden çok kez çağrılmaz (günlüğe kaydetmeyi denedim ve yalnızca bir günlük girdisi var). Potansiyel olarak konfigürasyonun diğer bölümlerinde entryPoint()'u birden çok kez arayabilirdik ve her zaman aynı örneği alırdık. Bu benim anlayışımı doğru mu? İlkbahar @Bean ile açıklamalı bazı yöntemlerin yeniden yazılmasını sağlıyor mu?Spring java yapılandırmasında @Bean açıklamalı bir yöntem çağrısı

@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();  
} 

cevap

61

Evet, Bahar bazı sihirli yapar.

Tüm @Configuration sınıflar CGLIB ile başlangıç ​​anında subclassed vardır: Spring Docs edin. Alt sınıfta, alt yöntem, üst yöntemi çağırmadan önce önbelleğe alınan (scoped) fasulye için önce kabı denetler ve yeni bir örnek oluşturur.

Bu (yenisi oluşturulmadı) @Bean yöntemlere aramalarınızı CGLIB aracılığıyla temsil edilmektedir ve bu nedenle fasulye önbelleğe alınmış sürümü döndürülür anlamına gelir.

@Bean s varsayılan kapsamı SINGLETON, PROTOTYPE gibi farklı bir kapsam belirtirseniz, çağrı özgün yönteme geçirilir.

+0

Bu şekilde oluşturulan fasulyeleri geçersiz kılmak mümkün mü? Örneğin, doğrudan bir fasulye oluşturma yöntemini çağıran bir Bahar tanımlı sınıfım var. İstediğim şey, bu yöntemle yaratılan fasülyenin kullanılmadığı, ancak ben kendimi tanımladığım ('Bean' ve 'Primary') ile açıklama yapmasıdır. – Fons

İlgili konular