Spring@Autowired注入がnullになった理由まとめ
6733 ワード
の原因となるの構成が欠けています.例えば、注釈スキャン駆動をオンにし、注入コンポーネントを登録します. newキーワードを使用して作成されたオブジェクトはspringコンテナに管理されず、注入できません. は静的変数を注入し、静的変数/クラス変数はオブジェクトの属性ではなく、クラスの属性であり、springはオブジェクトレベルの依存注入に基づいている.
静的注入の3つの方式
一部のツールクラスではサービス層のオブジェクトに依存する可能性があるが、一般的にツールクラスでは静的メソッドが使用され、対応するメンバー変数も静的と宣言する必要がある.この場合@Autowiredを直接使用して依存注入を行うと、メソッド呼び出し時にNullpointerExceptionが報告される.
試しに、dsForRWはこの状態で注入に依存することができず、実行時異常javaを放出する.lang.Null PointerException、なぜですか?静的変数/クラス変数はオブジェクトの属性ではなく、クラスの属性であり、springはオブジェクトレベルの依存注入に基づいている.しかし,ツールクラスをカプセル化し,@Component注釈で成功したエネルギーコンポーネントを好むが,機能コンポーネントのメソッドは一般的に静的メソッドであり,静的メソッドは静的メンバー変数しか呼び出せないため,次のような問題がある.パッケージ機能コンポーネントをカプセル化するには、下位レベルのサービス注入が必要になる場合がありますが、どうすればいいですか?ネット上で解決方法を探して、簡単にいくつかの実現方式をまとめました.
1.xml方式実現
この方式はXML構成に基づくWEBプロジェクトに適している.
2.@PostConstruct方式実現
@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 {
}まずSpringはAdvancedDatastoreのbeanをスキャンし、setter法で注入します.次に注意:メンバー変数に@Autowiredコメントを追加する必要はありません.
静的注入の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コメントを追加する必要はありません.