İlkbaharda başlatma sürecini engellemenin birkaç yolu vardır. Tüm fasulyeleri ve otomatik kablolamayı başlatmanız gerekiyorsa, bunu sağlayacağını bildiğim en az iki yol var. Sadece ikincisini test ettim ama ikisinin de aynı şekilde çalıştığına inanıyorum.
@Bean kullanıyorsanız, bunun gibi initMethod'a başvurabilirsiniz.
@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 kullanıyorsanız, @EventListener ile bu şekilde açıklama ekleyebilirsiniz.
@Component
public class BeanB {
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
}
}
Benim durumumda, Spring Boot'un seçilen çerçeve olduğu IoC / DI'yi kullandığım eski bir sistemim var. Eski sistem, tabloya birçok döngüsel bağımlılık getiriyor ve bu nedenle ayarlayıcı bağımlılığını çok kullanmalıyım. Ayarlayıcı tarafından otomatik kablolama / enjeksiyon henüz yapılmadığı için @ PostConstruct'a güvenemediğim için bu bana biraz baş ağrısı verdi. Sıra yapıcı, @PostConstruct ve ardından otomatik kablolu ayarlayıcılardır. Bunu tüm fasulyeler için en son ve "aynı" zamanda çalışacak @EventListener ek açıklaması ile çözdüm. Örnek InitializingBean aswell'in uygulanmasını gösterir.
Birbirine bağımlı iki sınıfım (@Component) var. Bu örnekte sınıflar aynı görünmektedir ve bunlardan yalnızca birini göstermektedir.
@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");
}
}
Bu, kapsayıcı başladığında çağrıların sırasını gösteren günlük çıktısıdır.
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
Gördüğünüz gibi @EventListener, her şey hazır ve yapılandırıldıktan sonra en son çalıştırılır.