在另一个bean的构造函数中引用时,@Autowired bean为null

下面显示的是我尝试引用我的ApplicationProperties bean的一段代码。 当我从构造函数中引用它时,它是空的,但是从另一个方法引用时,它是好的。 直到现在,我还没有在其他类中使用此自动assembly的bean没有问题。 但这是我第一次尝试在另一个类的构造函数中使用它。

在applicationProperties下面的代码片段中,当从构造函数中调用时是null,但是在convert方法中引用时不是。 我错过了什么

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

以下是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"); } 

自动assembly (从沙丘评论链接)发生后的对象build设。 因此在构造函数完成之后才会设置它们。

如果你需要运行一些初始化代码,你应该可以把构造函数中的代码放到一个方法中,然后用@PostConstruct注释该方法。

要在构build时注入依赖关系,您需要使用@Autowired annoation标记您的构造函数。

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