回答:
使用できます
@PostConstruct
public void init() {
// ...
}
または、クラスにInitializingBean
インターフェースを実装してafterPropertiesSet()
、Beanの構築時にApplicationContextが呼び出すコールバック関数()を提供することもできます。
Springで初期化プロセスをインターセプトする方法はいくつかあります。すべてのBeanを初期化し、それらをautowire / injectする必要がある場合、少なくとも2つの方法で、これを確実に行うことができます。私は2つ目のテストテットしか持っていませんが、どちらも同じように機能すると思います。
@Beanを使用している場合は、次のようにinitMethodで参照できます。
@Configuration
public class BeanConfiguration {
@Bean(initMethod="init")
public BeanA beanA() {
return new BeanA();
}
}
public class BeanA {
// method to be initialized after context is ready
public void init() {
}
}
@Componentを使用している場合は、次のように@EventListenerで注釈を付けることができます。
@Component
public class BeanB {
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
}
}
私の場合、レガシーシステムがあり、Spring Bootが選択されたフレームワークであるIoC / DIを利用しています。古いシステムでは、テーブルに多くの循環依存関係がもたらされるため、セッター依存関係を頻繁に使用する必要があります。@PostConstructを信頼できないため、セッターによる自動配線/注入がまだ行われていないため、いくつかの問題がありました。順序はコンストラクタであり、@ PostConstructは自動配線されたセッターです。最後にすべてのBeanに対して「同時に」実行される@EventListenerアノテーションを使用してそれを解決しました。この例では、InitializingBeanの実装も示しています。
2つのクラス(@Component)があり、相互に依存しています。この例では、クラスは1つだけ表示されているため、同じように見えます。
@Component
public class BeanA implements InitializingBean {
private BeanB beanB;
public BeanA() {
log.debug("Created...");
}
@PostConstruct
private void postConstruct() {
log.debug("@PostConstruct");
}
@Autowired
public void setBeanB(BeanB beanB) {
log.debug("@Autowired beanB");
this.beanB = beanB;
}
@Override
public void afterPropertiesSet() throws Exception {
log.debug("afterPropertiesSet()");
}
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
log.debug("@EventListener");
}
}
これは、コンテナの起動時の呼び出しの順序を示すログ出力です。
2018-11-30 18:29:30.504 DEBUG 3624 --- [ main] com.example.demo.BeanA : Created...
2018-11-30 18:29:30.509 DEBUG 3624 --- [ main] com.example.demo.BeanB : Created...
2018-11-30 18:29:30.517 DEBUG 3624 --- [ main] com.example.demo.BeanB : @Autowired beanA
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanB : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanB : afterPropertiesSet()
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : @Autowired beanB
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : afterPropertiesSet()
2018-11-30 18:29:30.607 DEBUG 3624 --- [ main] com.example.demo.BeanA : @EventListener
2018-11-30 18:29:30.607 DEBUG 3624 --- [ main] com.example.demo.BeanB : @EventListener
ご覧のとおり、@ EventListenerは、すべての準備が整って構成された後に最後に実行されます。
public class InitHelloWorld implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean,
String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean; // you can return any other object as well
}
public Object postProcessAfterInitialization(Object bean,
String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean; // you can return any other object as well
}
}