>  기사  >  Java  >  생성자에서 @Autowired Bean이 Null인 이유는 무엇입니까?

생성자에서 @Autowired Bean이 Null인 이유는 무엇입니까?

DDD
DDD원래의
2024-11-20 04:17:01286검색

Why Are @Autowired Beans Null in Constructors?

생성자의 Null @Autowired Bean 이해

Java 기반 Spring 애플리케이션에서 @Autowired 종속성은 일반적으로 Bean 인스턴스화 후에 주입됩니다. 즉, 생성자에서 @Autowired 빈을 참조하면 null이 됩니다.

제공된 코드 조각에서 DocumentManager 생성자에서 @Autowired applicationProperties 빈을 사용하려고 시도하지만 처음에는 null을 반환합니다. . 이는 생성 중에 @Autowired 빈을 아직 사용할 수 없기 때문에 예상되는 동작입니다.

이 문제를 방지하려면 @Autowired 빈에 의존하는 모든 초기화 로직을 @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 Bean이 Null인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.