2016-04-05 14 views
0

kullanarak değiştirebilirim. ApplicationContext kullanıyorum. Benim @Configuration sınıfındabahar çekirdeğini programlı çalışma süresinde ApplicationContext

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)applicationContext; 

ConfigurableListableBeanFactory registery = configContext.getBeanFactory(); 

registery.registerSingleton("XXX", new MyNewBeanDefintion()); 

basitçe

public interface ParentClass { 

public Item selectOneItem(); 

} 

public class X implements ParentClass { 

@Override 
public Item selectOneItem() { 
// return item 
} 

}

public class Y implements ParentClass { 
@Override 
public Item selectOneItem() { 
// return item 
} 
} 

ile

@Bean 
public ParentClass campaignSelection(){ 
if(type.equals("X")) { 

return new X(); 

} 
else if(type.equals("Y")){ 

return new Y(); 
} 

    return null; 

} 

var ve ben X arasında geçiş yapmak için fasulye ihtiyaç ihtiyaç Çalışma zamanında Y

+0

Neyi değiştirmek, özellik değerlerini güncellemek veya başka bir şey ile ne kastediyorsunuz? Hedef fasulye kapsamı nedir? – Evgeny

+0

@Evgeny, kabuğun enjekte edilen değerini – Hoda

cevap

1

Enjekte edilen örneğini campaignSelection fasulyenin yerine koymak için işaretçi arabirimini kullanabilirsiniz. Güncelleştirilmesi gereken diğer sınıfları bu arabirimi uygulayarak, diğer sınıfları da yapın. Sonra

Map<String, CampaignChangeAware> beansToUpdate = context.getBeansOfType(CampaignChangeAware.class); 
for (CampaignChangeAware bean : beansToUpdate.values()) { 
    bean.onCampaignChange(newCampaign); 
} 

kodu

kullanarak fasulye güncellemek mümkün olacak Ama bahar olarak singleton böyle fasulye yönetmek değildir diğer kapsamı ile önceden başlatılmış fasulye etkilemez.

+0

günceller, ancak @@Outowired özel ParentClass parentClass öğelerini nasıl kullanmalıyım? – Hoda

+0

@Hoda Her zamanki gibi kullanın. İlkbahar, fasulye oluşturulduğunda gerekli örneği enjekte eder. Çekirdekleri güncellemeniz gerektiğinde, enjekte edilen örneği 'onCampaignChange' yönteminde, yani parentClass = newCampaign' yerine değiştirin. Yeni fasulyeler için (prototip kapsamı ile) kodunuzu @Bean genel ParentClass campaignSelection() 'zahmetli çalışacak, istediğiniz türün yerini alacaktır. Örneğin, geçerli tür tutmak için bazı statik sınıf kullanabilirsiniz – Evgeny