Spring@Autowired注入がnullになった理由まとめ

6733 ワード

の原因となる
  • の構成が欠けています.例えば、注釈スキャン駆動をオンにし、注入コンポーネントを登録します.
  • newキーワードを使用して作成されたオブジェクトはspringコンテナに管理されず、注入できません.
  • は静的変数を注入し、静的変数/クラス変数はオブジェクトの属性ではなく、クラスの属性であり、springはオブジェクトレベルの依存注入に基づいている.

  • 静的注入の3つの方式
    一部のツールクラスではサービス層のオブジェクトに依存する可能性があるが、一般的にツールクラスでは静的メソッドが使用され、対応するメンバー変数も静的と宣言する必要がある.この場合@Autowiredを直接使用して依存注入を行うと、メソッド呼び出し時にNullpointerExceptionが報告される.
    @Autowired
    private static AdvancedDatastore dsForRW;
    

    試しに、dsForRWはこの状態で注入に依存することができず、実行時異常javaを放出する.lang.Null PointerException、なぜですか?静的変数/クラス変数はオブジェクトの属性ではなく、クラスの属性であり、springはオブジェクトレベルの依存注入に基づいている.しかし,ツールクラスをカプセル化し,@Component注釈で成功したエネルギーコンポーネントを好むが,機能コンポーネントのメソッドは一般的に静的メソッドであり,静的メソッドは静的メンバー変数しか呼び出せないため,次のような問題がある.パッケージ機能コンポーネントをカプセル化するには、下位レベルのサービス注入が必要になる場合がありますが、どうすればいいですか?ネット上で解決方法を探して、簡単にいくつかの実現方式をまとめました.
    1.xml方式実現
    この方式はXML構成に基づくWEBプロジェクトに適している.
    <bean id="mongoFileOperationUtil" class="com.*.*.MongoFileOperationUtil" init-method="init">
    	<property name="dsForRW" ref="dsForRW"/>
    bean>
    
    public class MongoFileOperationUtil {
        
        private static AdvancedDatastore dsForRW;
     
        private static MongoFileOperationUtil mongoFileOperationUtil;
     
        public void init() {
            mongoFileOperationUtil = this;
            mongoFileOperationUtil.dsForRW = this.dsForRW;
        }
     
    }
    

    2.@PostConstruct方式実現
    import org.mongodb.morphia.AdvancedDatastore;
    import org.springframework.beans.factory.annotation.Autowired;
     
     
    @Component
    public class MongoFileOperationUtil {
        @Autowired
        private static AdvancedDatastore dsForRW;
     
        private static MongoFileOperationUtil mongoFileOperationUtil;
     
        @PostConstruct
        public void init() {
            mongoFileOperationUtil = this;
            mongoFileOperationUtil.dsForRW = this.dsForRW;
        }
     
    }
    
    

    @PostConstruct注記のメソッドはクラスのコンストラクション関数をロードした後に実行され、つまりコンストラクション関数をロードした後にinitメソッドが実行されます.(@PreDestroy注記コンテナ破棄を定義する前の操作)この方法とxmlでinit-methodとdestory-methodを構成する方法は多くなく、springコンテナがbeanとコンテナ破棄を初期化する前の操作を定義します.
    3.setメソッドに@Autowired注記、クラス定義に@Component注記を追加
    import org.mongodb.morphia.AdvancedDatastore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;
    @Component public class MongoFileOperationUtil {
    private static AdvancedDatastore dsForRW;
    
    @Autowired
    public void setDatastore(AdvancedDatastore dsForRW) {
        MongoFileOperationUtil.dsForRW = dsForRW;
    }
    

    }まずSpringはAdvancedDatastoreのbeanをスキャンし、setter法で注入します.次に注意:メンバー変数に@Autowiredコメントを追加する必要はありません.