Le bean @Autowired est null lorsqu’il est référencé dans le constructeur d’un autre bean

Voici un extrait de code où j’essaie de référencer mon bean ApplicationProperties. Lorsque je le référence à partir du constructeur, il est nul, mais lorsqu’il est référencé à partir d’une autre méthode, c’est bien. Jusqu’à présent, je n’ai pas eu de problème pour utiliser ce bean auto-tiré dans d’autres classes. Mais c’est la première fois que je tente de l’utiliser dans le constructeur d’une autre classe.

Dans l’extrait de code ci-dessous, applicationProperties est null lorsqu’il est appelé par le constructeur, mais lorsqu’il est référencé dans la méthode convert, il ne l’est pas. Qu’est-ce que je rate

@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, Ssortingng sourceExtension, Ssortingng targetExtension) { byte[] result = null; startOOServer(); ... 

Voici l’extrait de code 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() { Ssortingng val = appProperties.getProperty("startOOServer", "false"); if( val == null ) return false; val = val.sortingm(); return val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes"); } 

    Autowiring (lien du commentaire Dunes) se produit après la construction d’un object. Par conséquent, ils ne seront définis qu’après la fin du constructeur.

    Si vous avez besoin d’exécuter du code d’initialisation, vous devriez pouvoir extraire le code du constructeur dans une méthode et annoter cette méthode avec @PostConstruct .

    Pour avoir des dépendances injectées au moment de la construction, votre constructeur doit être marqué avec l’ @Autowired @Autowired comme cela.

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