首页  >  文章  >  Java  >  为什么@Autowired Beans在构造函数中为空?

为什么@Autowired Beans在构造函数中为空?

DDD
DDD原创
2024-11-20 04:17:01271浏览

Why Are @Autowired Beans Null in Constructors?

了解构造函数中的 Null @Autowired Bean

在基于 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn