2016-04-05 39 views
0

我需要通過webservice在運行時修改一些spring bean。我使用ApplicationContext。在運行時使用ApplicationContext以編程方式修改spring bean

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)applicationContext; 

ConfigurableListableBeanFactory registery = configContext.getBeanFactory(); 

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

在我@Configuration類有

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

return new X(); 

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

return new Y(); 
} 

    return null; 

} 

與單純

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 
} 
} 

,我需要,我需要這個bean X之間切換, Y在運行時

+0

你是指修改,更新屬性值還是別的什麼意思?目標豆的範圍是什麼? – Evgeny

+0

@Evgeny更新bean的注入值 – Hoda

回答

1

要替換注入的campaignSelection bean實例,可以使用標記界面,例如,

public interface CampaignChangeAware {  
    void onCampaignChange(ParentClass newCampaign); 
} 

讓其他必須更新的類實現此接口。然後,你就可以使用代碼

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

更新咖啡豆,但它不與其它該singleton如春不管理等豆類範圍影響已初始化bean。

+0

但我該如何使用 @Autowired private ParentClass parentClass; – Hoda

+0

@Hoda像往常一樣使用它。當bean被創建時,Spring會注入必要的實例。當你需要更新bean時,只需在'onCampaignChange'方法中替換注入的實例,即'parentClass = newCampaign'。對於新的bean(具有原型範圍),您的代碼'@Bean public ParentClass campaignSelection()'將完美工作,只需替換所需的類型。例如,你可以使用一些靜態類來保存當前類型 – Evgeny

相關問題