Springで管理されていないクラスにプロパティ値を注入する方法

1概要

設計上、 @ Repository、@ Service、@ Controller などのアノテーションが付けられたクラスはSpringによって管理され、そこに設定を注入することは簡単で自然です。それほど単純ではないのは、Springによって直接管理されていないクラスに設定を渡すことです。

その場合は、 __ ClassLoaderベースの設定ロードを使用するか、単に別のBeanでクラスをインスタンス化して必要なパラメータを手動で設定することができます - 設定エントリは ** 。properties__ファイルに排他的に格納する必要がないので推奨されるオプションです。

このクイック記事では、Java ClassLoader を使用した 。propertiesファイルのロード、および既にリンクされていないリンクへのインジェクション:/properties-with-spring[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 を探しています。

その後、 getResourceAsStream APIを介してリソースファイルを 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);
    }
}

Initializer は、 ClassNotManagedBySpring. のインスタンス化を担当できるようになりました。

次に、 Initializer インスタンスにアクセスし、その上で initClass() メソッドを実行して、カスタム ClassNotManagedBySpring のインスタンス化を処理します。

ClassNotManagedBySpring classNotManagedBySpring = initializer.initClass();

Initializer を参照したら、カスタム ClassNotManagedBySpring. をインスタンス化できます。

4概要

このクイックチュートリアルでは、プロパティをSpring以外のJavaクラスに読み込むことに焦点を当てました。

いつものように、実装例はhttps://github.com/eugenp/tutorials/tree/master/spring-core[over GitHub]にあります。