SpringBootはabstractクラスのメンバー変数に値を割り当てることができません.


問題の説明
SpringBoot環境では、プロファイル内の1つのパラメータxxxが構成可能であり、抽象クラスのメンバー変数にこの構成の値を動的に読み出すことを望む.直接使用
@Value("${xxx}")
private String xxx;

xxxの値がnullであることを発見して、資料を調べて原因を発見します:SpringBootは直接抽象クラスに注入することを許さない
ソリューション
  • @Value注記を使用しないでabstractクラスのxxxメンバー変数にgetter and setter
  • を追加してください.
    private String xxx;
    public String getXxx() {
        return xxx;
    }
    public void setXxx(String xxx) {
        this.xxx = xxx;
    }
    
  • システムパラメータクラス
  • を新規作成
    public class SystemParameter {
        private SystemParameter(){}
        public static String xxx;
    }
    
  • 新しいコンフィギュレーションクラス
  • @Configuration
    public class SystemConfig {
        @Value("${xxx}")
        private String xxx;
        @Bean
        public SystemParameter getSystemParameter(){
            SystemParameter.xxx = xxx;
            return null ;
        }
    }
    

    ここでは、コンテナのロード時に${xxx}の内容を読み込み、メモリからシステムパラメータに直接xxxを割り当てる静的変数xxxです.
  • abstractクラスのすべてのサブクラス呼び出しを変更する
  • クラスのロード時にabstractクラスのxxxに値を付与すればよい.具体的には、そのクラスの作成時の構造方法、または他の作成タイミングである可能性がある.
    this.setXxx(SystemParameter.xxx);
    

    このような利点は、そのオブジェクトのインスタンスが共通のxxx属性を呼び出すことなく、一定の操作可能な空間があることである.