web-dev-qa-db-ja.com

Spring Context @ Configurationでvoidセットアップメソッドを実行します

SpringContext内でいくつかのセットアップメソッドを実行したいと思います。

現在、次のコードがありますが、beansであり、戻り値の型がないと言っているため、機能しません。

@Configuration
@Component
public class MyServerContext {

    ...

    // Works
    @Bean
    public UserData userData() {
        UserData userData = new AWSUserDataFetcher(urlUtil()).fetchUserData();
        return userData;
    }   

    // Doesn't work
    @Bean
    public void setupKeyTrustStores() {
        // Setup TrustStore & KeyStore
        System.setProperty(SYS_TRUST_STORE, userData().get(TRUST_STORE_PATH));
        System.setProperty(SYS_TRUST_STORE_PASSWORD, userData().get(TRUST_STORE_PASSWORD));
        System.setProperty(SYS_KEY_STORE, userData().get(KEY_STORE_PATH));
        System.setProperty(SYS_KEY_STORE_PASSWORD, userData().get(KEY_STORE_PASSWORD));

        // Prevents handshake alert: unrecognized_name
        System.setProperty(ENABLE_SNI_EXTENSION, "false");
    }

    ...

}

@Configurationアノテーションなしで@Beanコンテキストによってこのメソッドを自動的に実行するにはどうすればよいですか?

10
ptimson

@PostConstructの代わりに@Beanアノテーションを使用できます。

@Configuration
@Component
public class MyServerContext {

    @Autowired
    private UserData userData; // autowire the result of userData() bean method

    @Bean
    public UserData userData() {
        UserData userData = new AWSUserDataFetcher(urlUtil()).fetchUserData();
        return userData;
    }   

    @PostConstruct
    public void setupKeyTrustStores() {
        // Setup TrustStore & KeyStore
        System.setProperty(SYS_TRUST_STORE, userData.get(TRUST_STORE_PATH));
        System.setProperty(SYS_TRUST_STORE_PASSWORD, userData.get(TRUST_STORE_PASSWORD));
        System.setProperty(SYS_KEY_STORE, userData.get(KEY_STORE_PATH));
        System.setProperty(SYS_KEY_STORE_PASSWORD, userData.get(KEY_STORE_PASSWORD));

        // Prevents handshake alert: unrecognized_name
        System.setProperty(ENABLE_SNI_EXTENSION, "false");
    }

    ...

}
14

@ beanの代わりに@PostConstructを使用

@PostConstruct

溶接リファレンス のため、射出と初期化はこの順序で行われます。

  1. 最初に、コンテナーはBeanコンストラクター(デフォルトのコンストラクターまたは@Injectアノテーションが付けられたコンストラクター)を呼び出して、Beanのインスタンスを取得します。
  2. 次に、コンテナはBeanのすべての注入されたフィールドの値を初期化します。
  3. 次に、コンテナはBeanのすべての初期化メソッドを呼び出します(呼び出し順序は移植性がないため、それに依存しないでください)。
  4. 最後に、@PostConstructメソッドが呼び出されます。

したがって、@PostConstructを使用する目的は明確です。注入されたBean、リソースなどを初期化する機会を提供します。

public class Person {

    // you may have injected beans, resources etc.

    public Person() {
        System.out.println("Constructor is called...");
    }

    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct is called...");
    } }

したがって、PersonBeanを注入することによる出力は次のようになります。

コンストラクタは呼ばれます...

@PostConstructが呼び出されます...

@PostConstructに関する重要なポイントの1つは、プロデューサーメソッドを介してBeanを注入して初期化しようとすると、呼び出されないことです。プロデューサーメソッドを使用するということは、プログラムでBeanを作成、初期化、および新しいキーワードで注入することを意味するためです。

リソースリンク:

  1. CDI依存性注入@PostConstructおよび@PreDestroyの例
  2. なぜ@PostConstructを使用するのですか?
2
SkyWalker