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
コンテキストによってこのメソッドを自動的に実行するにはどうすればよいですか?
@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");
}
...
}
溶接リファレンス のため、射出と初期化はこの順序で行われます。
@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を作成、初期化、および新しいキーワードで注入することを意味するためです。