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
.