@Autowired bean é nulo quando referenciado no construtor de outro bean

Abaixo, é mostrado um trecho de código onde tento fazer referência ao meu bean ApplicationProperties. Quando eu referenciá-lo do construtor é nulo, mas quando referenciado de outro método é bom. Até agora não tive nenhum problema em usar esse bean autowired em outras classs. Mas esta é a primeira vez que eu tentei usá-lo no construtor de outra class.

No trecho de código abaixo de applicationProperties é nulo quando chamado do construtor, mas quando referenciado no método de conversão não é. O que estou perdendo

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

Abaixo está s snippet 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"); } 

Autowiring (link do comentário do Dunes) acontece após a construção de um object. Portanto, eles não serão definidos até que o construtor seja concluído.

Se você precisar executar algum código de boot, poderá puxar o código do construtor para um método e anotar esse método com @PostConstruct .

Para ter dependencies injetadas em tempo de construção, você precisa ter seu construtor marcado com a @Autowired @Autowired assim.

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