質問:
通常の @Component アノテーションを使用して Spring 管理にクラスを渡し、使用時に @Resource を使用してオブジェクトをインジェクトすると、静的メソッドが存在しない場合は問題ありませんが、次のように静的メソッドが出現した場合は問題ありません。 this を使用すると、 null ポインタ例外。つまり、 @Resource によって挿入されたオブジェクトが null です。
理由:
メソッドまたは変数が 静的に 変更される場合、変更されたメソッドまたは変数はクラスのメソッドまたは変数になり、クラスがロードされるときにロードされ、現在のクラスの下にあるすべてのオブジェクトによって共有されます。@Resource の役割は、 Springbean ファクトリ内のオブジェクトを照合し、オブジェクトの注入を完了することです。これはオブジェクト レベルで行われます。この時点で、クラスのすべての静的プロパティがロードされています。
問題の原因はクラスのロード順序にあり、静的属性はプログラムの初回起動時にロードされ、それ以降は変更されませんが、 @Resource アノテーションを使用すると毎回 Spring が使用されてしまいます。コンテナが Bean を取得すると、静的変数が初期化された後、 @Resource は空になります。
解決:
ここでは、アノテーション@PostConstruct について学習します。
Spring Boot プロジェクトでは、クラスがインスタンス化された後に呼び出され、依存関係の注入が完了した後に実行されるメソッドを
@PostConstruct
マークするためにアノテーションが使用されます。その役割は、オブジェクトの作成後にいくつかの初期化操作を実行することです。具体的には、アノテーションは、依存関係の注入後に必要な初期化タスクを実行する
@PostConstruct
ために、依存関係の注入と組み合わせて使用されることがよくあります。Spring コンテナは、アノテーション付きBean をインスタンス化するときに、すべての依存関係の注入が完了した後に、アノテーション付きメソッドを呼び出します。@PostConstruct
したがって、静的メソッドで Spring マネージド Bean を使用する場合は、次のようにします。
@Component
public class FileUpload {
@Resource
private CommonConfig commonConfig;
private static FileUpload fileUpload;
@PostConstruct
public void init(){
fileUploadUtil = this;
fileUploadUtil.commonConfig= commonConfig;
}
public static void testSpring(){
fileUploadUtil.commonConfig.xxxx ; // 调用commonConfig
}
}
このコードは、
CommonConfig
オブジェクトをFileUploadUtil
クラスに挿入し、初期化中にそれを静的変数に割り当てます。これにより、他の場所にある静的変数を介してオブジェクトとプロパティfileUploadUtil
にアクセスできるようになります。FileUploadUtil
commonConfig