2011-06-13 12 views
65

A continuación se muestra un fragmento de código donde intento hacer referencia a mi bean ApplicationProperties. Cuando lo hago referencia desde el constructor, es nulo, pero cuando se hace referencia desde otro método, está bien. Hasta ahora no he tenido problemas para usar este bean autowired en otras clases. Pero esta es la primera vez que intento usarlo en el constructor de otra clase.@El bean cableado es nulo cuando se hace referencia en el constructor de otro bean

En el fragmento de código debajo de applicationProperties es nulo cuando se llama desde el constructor pero cuando se hace referencia en el método de conversión no lo es. ¿Qué me falta

@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 continuación se muestra s fragmento de ApplicationProperties ...

@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"); 
    } 
+0

¿Podemos ver su xml? – Drahakar

Respuesta

129

Autowiring (enlace desde comentario dunas) sucede después de la construcción de un objeto. Por lo tanto, no se establecerán hasta después de que el constructor haya completado.

Si necesita ejecutar algún código de inicialización, debería poder extraer el código en el constructor en un método y anotar ese método con @PostConstruct.

+3

Como dice en los documentos - http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html – Dunes

+0

Gracias por el enlace, lo haré agréguelo a la respuesta para encontrarlo fácilmente. –

+2

Gracias, todavía tenía que encontrar la declaración crucial "Los campos se inyectan inmediatamente después de la construcción de un frijol ...". He probado la anotación @PostConstruct y es exactamente lo que necesitaba. – hairyone

28

Para tener dependencias inyectadas en tiempo de construcción necesita tener su constructor marcado con la anotación @Autowired como tal.

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

No lo he probado, pero se ve fantástico. – asgs

+1

En realidad, creo que esta debería ser la respuesta preferida. El enfoque de inyección de dependencias basado en el constructor es muy adecuado para los componentes obligatorios. Usando este enfoque, el marco de resorte también podrá detectar dependencias cíclicas en los componentes (como en A, depende de B, B depende de C, C depende de A). El estilo de inyección utilizando setters o campos autoconectados es capaz de inyectar beans no completamente inicializados en su campo, haciendo las cosas un poco más complicadas. – Seakayone

Cuestiones relacionadas