@Autowired bean, başka bir bean yapıcısında başvurulduğunda null


90

Aşağıda, ApplicationProperties bean'ıma başvurduğum ve denediğim bir kod parçacığı gösterilmektedir. Yapıcıdan başvurduğumda boş, ancak başka bir yöntemden başvurulduğunda sorun değil. Şimdiye kadar bu otomatik telli fasulyeyi diğer sınıflarda kullanırken hiçbir sorun yaşamadım. Ama bu, onu başka bir sınıfın kurucusunda ilk kez kullanmaya çalışıyorum.

Aşağıdaki kod parçacığında applicationProperties, yapıcıdan çağrıldığında boştur, ancak dönüştürme yönteminde başvurulduğunda değildir. Neyi kaçırıyorum

@Component
public class DocumentManager implements IDocumentManager {

  private Log logger = LogFactory.getLog(this.getClass());
  private OfficeManager officeManager = null;
  private ConverterService converterService = null;

  @Autowired
  private IApplicationProperties applicationProperties;


  // If I try and use the Autowired applicationProperties bean in the constructor
  // it is null ?

  public DocumentManager() {
  startOOServer();
  }

  private void startOOServer() {
    if (applicationProperties != null) {
      if (applicationProperties.getStartOOServer()) {
        try {
          if (this.officeManager == null) {
            this.officeManager = new DefaultOfficeManagerConfiguration()
              .buildOfficeManager();
            this.officeManager.start();
            this.converterService = new ConverterService(this.officeManager);
          }
        } catch (Throwable e){
          logger.error(e);  
        }
      }
    }
  }

  public byte[] convert(byte[] inputData, String sourceExtension, String targetExtension) {
    byte[] result = null;

    startOOServer();
    ...

Aşağıda ApplicationProperties'den bir pasaj var ...

@Component
public class ApplicationProperties implements IApplicationProperties {

  /* Use the appProperties bean defined in WEB-INF/applicationContext.xml
   * which in turn uses resources/server.properties
   */
  @Resource(name="appProperties")
  private Properties appProperties;

  public Boolean getStartOOServer() {
    String val = appProperties.getProperty("startOOServer", "false");
    if( val == null ) return false;
    val = val.trim();
    return val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes");
  }

Yanıtlar:


181

Otomatik kablolama (Dunes yorumundan bağlantı) bir nesnenin yapımından sonra gerçekleşir. Bu nedenle, kurucu tamamlanana kadar ayarlanmayacaktır.

Bazı başlatma kodunu çalıştırmanız gerekiyorsa, yapıcıdaki kodu bir yönteme çekebilmeli ve bu yönteme @PostConstruct.


3
Dokümanlarda söylendiği gibi
Dunes

Bağlantı için teşekkürler, kolay bulunabilmesi için cevaba ekleyeceğim.
nicholas.hauschild

2
Teşekkürler, "Tarlalar fasulyenin yapımından hemen sonra enjekte edilir ..." diye çok önemli bir ifadeye henüz rastlamamıştım. @PostConstruct açıklamasını denedim ve tam da ihtiyacım olan şey buydu.
hairyone


@Tim Teşekkürler! Cevaplar bağlantısını Spring 3.2 sürümüne güncelledim ve ayrıca bağlantınızın Spring 3.2 sürümünü de ekledim.
nicholas.hauschild

44

Yapım zamanında bağımlılıkların yerleştirilmesi için, @Autowiredkurucunuzun böyle bir açıklama ile işaretlemesini sağlamanız gerekir.

@Autowired
public DocumentManager(IApplicationProperties applicationProperties) {
  this.applicationProperties = applicationProperties;
  startOOServer();
}

2
Aslında bunun tercih edilen cevap olması gerektiğini düşünüyorum. Yapıcı tabanlı bağımlılık ekleme yaklaşımı, zorunlu bileşenler için çok uygundur. Bu yaklaşımı kullanarak yay çerçevesi, bileşenlere olan döngüsel bağımlılıkları da tespit edebilecektir (A'da B'ye bağlıdır, B C'ye bağlıdır, C A'ya bağlıdır). Ayarlayıcıları veya otomatik kablolanmış alanları kullanan enjeksiyon stili, tam olarak başlatılmamış fasulyeleri tarlanıza enjekte edebilir ve işleri biraz daha karmaşık hale getirir.
Seakayone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.