ホームページ  >  記事  >  Java  >  @Autowired Bean がコンストラクターで null になるのはなぜですか?

@Autowired Bean がコンストラクターで null になるのはなぜですか?

DDD
DDDオリジナル
2024-11-20 04:17:01270ブラウズ

Why Are @Autowired Beans Null in Constructors?

コンストラクター内の Null @Autowired Bean について

Java ベースの Spring アプリケーションでは、通常、@Autowired 依存関係は Bean のインスタンス化後に挿入されます。これは、コンストラクターで @Autowired Bean を参照すると、null になることを意味します。

提供されたコード スニペットでは、DocumentManager コンストラクターで @Autowired applicationProperties Bean を使用しようとしていますが、最初は null を返します。 。 @Autowired Bean は構築中にまだ使用できないため、これは予期された動作です。

この問題を回避するには、@Autowired Bean に依存する初期化ロジックを、@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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。