Spring マネージド Bean で静的メソッドを使用するためのヒント - @PostConstruct

質問:

        通常の @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にアクセスできるようになります。FileUploadUtilcommonConfig

おすすめ

転載: blog.csdn.net/weixin_73077810/article/details/132623984