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 サイトの他の関連記事を参照してください。