Springによって管理されていないクラスにプロパティ値を注入する方法は?
1. 概要
設計上、 @ Repository、@ Service、@Controllerなどの注釈が付けられたクラス。 Springによって管理されており、設定を注入するのは簡単で自然です。 それほど単純ではないのは、Springによって直接管理されていないクラスに構成を渡すことです。
その場合、 ClassLoader- ベースの構成の読み込みを使用するか、別のbeanでクラスをインスタンス化して、必要なパラメーターを手動で設定できます。構成エントリをに保存する必要がないため、これが推奨されるオプションです。 *。propertiesファイルのみ。
このクイック記事では、Java ClassLoaderを使用して*。propertiesファイルをロードするトピックと、Springによってすでにロードされた構成をインジェクションするトピックについて説明します。アンマネージクラス。
2. クラスローダーを使用したロード構成
簡単に言えば、*。propertiesファイルは、いくつかの構成情報を保持するリソースファイルです。 自動アプリケーション構成の読み込みをサポートするサードパーティの実装を使用する代わりに、たとえば Springに実装されているので、Java ClassLoaderを使用して同じことを行うことができます。
resourceFileNameで定義されたPropertiesを保持するコンテナオブジェクトを作成します。 コンテナーを構成で満たすには、ClassLoaderを使用します。
loadProperties(String resourceFileName)メソッドを実装するPropertiesLoaderクラスを定義しましょう。
public class PropertiesLoader {
public static Properties loadProperties(String resourceFileName) throws IOException {
Properties configuration = new Properties();
InputStream inputStream = PropertiesLoader.class
.getClassLoader()
.getResourceAsStream(resourceFileName);
configuration.load(inputStream);
inputStream.close();
return configuration;
}
}
すべてのClassオブジェクトには、それをインスタンス化したClassLoaderへの参照が含まれています。 これは主にクラスのロードを担当するオブジェクトですが、このチュートリアルでは、プレーンなJavaクラスの代わりにリソースファイルのロードに使用します。 ClassLoader は、クラスパスでresourceFileNameを探しています。
その後、 getResourceAsStreamAPIを介してリソースファイルをInputStreamとしてロードします。
上記の例では、 load(InputStream)APIを使用してresourceFileNameを解析できる構成コンテナーを定義しました。
loadメソッドは、 “:”または“=”文字を区切り文字としてサポートする*。propertiesファイルの解析を実装します。 さらに、改行の先頭で使用される“#” または“!” 文字は両方ともコメントマーカーであり、その行は無視されます。
最後に、構成ファイルから定義された構成エントリの正確な値を読み取りましょう。
String property = configuration.getProperty(key);
3. Springを使用した構成のロード
2番目の解決策は、Spring Spring機能を利用して、ファイルの低レベルのロードと処理の一部を処理することです。
カスタムクラスを初期化するために必要な構成を保持するInitializerを定義しましょう。 Bean の初期化中に、フレームワークは*。properties構成ファイルから@Valueで注釈が付けられたすべてのフィールドをロードします。
@Component
public class Initializer {
private String someInitialValue;
private String anotherManagedValue;
public Initializer(
@Value("someInitialValue") String someInitialValue,
@Value("anotherValue") String anotherManagedValue) {
this.someInitialValue = someInitialValue;
this.anotherManagedValue = anotherManagedValue;
}
public ClassNotManagedBySpring initClass() {
return new ClassNotManagedBySpring(
this.someInitialValue, this.anotherManagedValue);
}
}
The イニシャライザーこれで、インスタンス化を担当できます ClassNotManagedBySpring
次に、 Initializer インスタンスにアクセスし、そのインスタンスで initClass()メソッドを実行して、カスタムClassNotManagedBySpringのインスタンス化を処理します。
ClassNotManagedBySpring classNotManagedBySpring = initializer.initClass();
参照を取得したらイニシャライザー 、カスタムをインスタンス化できるようになります
4. 概要
このクイックチュートリアルでは、プロパティをSpring以外のJavaクラスに読み込むことに焦点を当てました。
いつものように、実装例はGitHubのにあります。