ヌルポインタとしての@Autowiredインジェクションの理由と解決策について

問題の背景

yml構成ファイルからパラメーターを読み取り、構成エンティティクラスを記述し、GETメソッドとSETメソッドを追加し、@ Autowiredがこの構成クラスを他のクラスに挿入するときにnullポインターを報告する必要があります。

問題の1つを引き起こします

1.時間指定タスクで他のクラスを呼び出すことはできません。2。クラスを新規作成することはできません。
次に、時限タスクが新しいプロセスを開始し、スプリング値が初期クラスに注入されるため、値を注入しますが、この値のクラスは使用されませんが、値のないクラスが呼び出されます。

問題の2つを引き起こします


ここに画像の説明を挿入
人間の言葉を翻訳するGoogleのすばらしい回答は次のとおりです。初期化シーケンス

メンバー変数の初期化->コンストラクター-> @ Autowired

getを呼び出すとき、それはまだautowiredのライフサイクルに入っておらず、自然に空であり、値を取得できず、nullポインターエラーが報告されます。

解決

ツールを紹介する

/**
 * @author [email protected]
 * 此工具类用于从Spring的上下文中去获取到类,解决@autowird注入空指针的问题
 * @version 1.0
 * @date 2020/10/27 16:54
 */
@Component
public class ApplicationContextHelperUtil implements ApplicationContextAware {
    
    
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext( ApplicationContext applicationContext1 ) throws BeansException {
    
    
        applicationContext = applicationContext1;
    }

    public static ApplicationContext getApplicationContext(){
    
    
        return applicationContext;
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class<T> clazz) {
    
    
        return (T) applicationContext.getBean(clazz);
    }
}

同時に、メソッドはによって呼び出されます

@Autowired
HeartbeatConfig heartbeatConfig;

private static HeartbeatConfig heartbeatConfig =(HeartbeatConfig) ApplicationContextHelperUtil.getBean(HeartbeatConfig.class);

おすすめ

転載: blog.csdn.net/wenyichuan/article/details/109315211