que mkyong funcion bean java spring autowired

java - mkyong - @El bean autoajustado es nulo cuando se hace referencia en el constructor de otro bean



que es un bean en spring (2)

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.

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 estoy perdiendo

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


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

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


Autowiring (enlace de Dunes comment) ocurre 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 .