programing

@autowed bean은 다른 bean의 컨스트럭터에서 참조되는 경우 null입니다.

procenter 2022. 9. 24. 22:16
반응형

@autowed bean은 다른 bean의 컨스트럭터에서 참조되는 경우 null입니다.

아래는 Application Properties bean을 참조하는 코드 조각입니다.컨스트럭터에서 참조할 때는 늘이지만 다른 메서드에서 참조할 때는 괜찮습니다.지금까지 저는 이 자동배선콩을 다른 수업에서 사용하는 데 전혀 문제가 없었습니다.하지만 다른 클래스의 컨스트럭터에서 사용하는 것은 이번이 처음입니다.

다음 코드 스니펫에서는 applicationProperties가 컨스트럭터에서 호출될 때는 늘이지만 변환 메서드에서 참조될 때는 늘이 아닙니다.내가 뭘 놓쳤지?

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

다음은 Application Properties의 일부입니다.

@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");
  }

자동 배선(Dunes 주석 링크)은 객체 구축 후에 발생합니다.따라서 생성자가 완료될 때까지 설정되지 않습니다.

초기화 코드를 실행해야 할 경우 컨스트럭터의 코드를 메서드로 풀하고 그 메서드에 주석을 붙일 수 있습니다.

건설 시 종속성을 주입하려면 컨스트럭터에 다음 마크를 붙여야 합니다.@Autowired이렇게 annoation.

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

네, 둘 다 정답입니다.

솔직히 이 문제는 'Why Spring is my Spring @Autowired field is null?'이라는 글과 비슷합니다.

에러의 근본 원인에 대해서는, Spring 레퍼런스 문서(Autowired)를 참조해 주세요.

자동 배선 필드

필드는 bean 구성 직후 설정 메서드가 호출되기 전에 주입됩니다.

그러나 Spring document에서 이 말을 하는 진짜 이유는 봄의 Bean 라이프 사이클입니다.이것은 Spring의 디자인 철학의 일부입니다.

다음은 Spring Bean 라이프 사이클의 개요입니다.여기에 이미지 설명 입력 필드 등의 속성을 주입하려면 먼저 콩을 초기화해야 합니다.콩은 이렇게 설계되어 있기 때문에, 이것이 진짜 이유입니다.

이 대답이 너에게 도움이 되었으면 좋겠어!

언급URL : https://stackoverflow.com/questions/6335975/autowired-bean-is-null-when-referenced-in-the-constructor-of-another-bean

반응형