在基于 Java 的 Spring 应用程序中,@Autowired 依赖项通常在 bean 实例化后注入。这意味着,如果您在构造函数中引用 @Autowired bean,它将为 null。
在提供的代码片段中,您尝试在 DocumentManager 构造函数中使用 @Autowired applicationProperties bean,但它最初返回 null 。这是预期的行为,因为 @Autowired beans 在构造期间尚不可用。
要避免此问题,请考虑将依赖于 @Autowired beans 的任何初始化逻辑移至使用 @PostConstruct 注释的单独的构造后方法。 @PostConstruct 方法在 bean 实例化之后、bean 准备使用之前执行。
在下面更正的代码中,startOOServer() 方法已移至 @PostConstruct 方法:
@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; // Constructors may not access @Autowired beans, so move this logic to a @PostConstruct method public DocumentManager() { } @PostConstruct public 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(); ... }
通过使用 @PostConstruct 方法,初始化代码现在可以安全地依赖可用的 @Autowired 依赖项。
以上是为什么@Autowired Beans在构造函数中为空?的详细内容。更多信息请关注PHP中文网其他相关文章!