Şu satırı dahil ederiz
import com.hazelcast.spring.context.SpringManagedContext;
Spring bean'lerine erişim içindir
Kullanım
1. Bir tane SpringManagedContext bean yaratılır
2. Bir tane Hazelcast Config sınıfından bean yaratılır
SpringManagedContext bean Config nesnesine setManagedContext() metodu ile atanır
3. Hazelcast kaynaklarına erişen sınıfı @SpringAware ile işaretlerim. Bu anotasyon bir Spring Bean tanımlamanın Hazelcast yöntemi. Eğer bu anotasyonu kullanmak istemiyorsam sanırım Spring'in ApplicationContextAware arayüzünden kalıtmak lazım
setApplicationContext metodu
Kod şöyle. Yani Spring'in ApplicationContextAware arayüzünden kalıtım olduğu için setApplicationContext() metodu ile Spring'in ApplicationContext nesnesine erişim sağlanır.
import com.hazelcast.core.ManagedContext; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class SpringManagedContext implements ManagedContext, ApplicationContextAware { private AutowireCapableBeanFactory beanFactory; ... @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.beanFactory = applicationContext.getAutowireCapableBeanFactory(); } }
Örnek
Şöyle yaparız. Burada SpringManagedContext diye bir bean yaratıyoruz ve onu Config sınıfına atıyoruz. MyBatchSource sınıfı da ApplicationContextAware kalıtımı yapıyor ve bir bean oluyor. Dolayısıyla setApplicationContext() metodu lazım ama esas konu bu değil.
MyBatchSource constructor içinde ManagedContext nesnesi geliyor. Bu nesne SpringManagedContext'e cast ediliyor. ve SpringManagedContext.init() çağrılıyor. SpringManagedContext.init() metodu da AutowireCapableBeanFactory ile bu nesnedeki tüm @Autowired anotayonlarını dolduruyor.
@Bean public SpringManagedContext managedContext() { return new SpringManagedContext(); } @Bean public Config config(ManagedContext managedContext) { Config config = new Config(); config.setManagedContext(managedContext); } @SpringAware class MyBatchSource implements ApplicationContextAware { private ApplicationContext applicationContext; MyBatchSource(ManagedContext managedContext) { if (managedContext instanceof SpringManagedContext) { SpringManagedContext springManagedContext = (SpringManagedContext) managedContext; springManagedContext.initialize(this); } } void fillBufferFn() { Config config = this.applicationContext.getBean(Config.class); ... } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
Hiç yorum yok:
Yorum Gönder