ben referans için bu bırakacağım ama güncellenmiş cevap bölücü aşağıdaki gibidir:
Eh ConfigurableApplicationContext
arayüzü istediğini olması gereken bir refresh() yöntemi içerir, ancak soru şu: nasıl erişmek için bu yöntem. Ya
- Task Execution Framework kullanmak
private ConfigurableApplicationContext context;
@Autowired
public void setContext(ConfigurableApplicationContext ctx){
this.context = ctx;
}
Şimdi öneririm iki temel seçenek olacaktır: Eğer bunu Hangi yolu, tip ConfigurableApplicationContext
bir bağımlılık olan bir fasulye ile başlayacağız Fasulyeinizin düzenli olarak mülk kaynaklarını izleyebilmesini sağlayın, değişiklikleri bulduğunda ApplicationContext'i veya expose the bean to JMX'u yenileyin, yenilemeyi manuel olarak tetiklemenizi sağlayın.
yorumlarla değinen: Bu metnin bütününü yenilemek için imkansız gibi çünkü alternatif bir strateji özellikler fabrika fasulye oluşturmak ve diğer tüm fasulye içine enjekte etmek olacaktır.
public class PropertiesFactoryBean implements FactoryBean<Properties>{
public void setPropertiesResource(Resource propertiesResource){
this.propertiesResource = propertiesResource;
}
private Properties value=null;
long lastChange = -1L;
private Resource propertiesResource;
@Override
public Properties getObject() throws Exception{
synchronized(this){
long resourceModification = propertiesResource.lastModified();
if(resourceModification != lastChange){
Properties newProps = new Properties();
InputStream is = propertiesResource.getInputStream();
try{
newProps.load(is);
} catch(IOException e){
throw e;
} finally{
IOUtils.closeQuietly(is);
}
value=newProps;
lastChange= resourceModification;
}
}
// you might want to return a defensive copy here
return value;
}
@Override
public Class<?> getObjectType(){
return Properties.class;
}
@Override
public boolean isSingleton(){
return false;
}
}
Hep prototip kapsamını kullanmak ancak, dikkatli olmak gerekir, diğer tüm fasulye içine bu özellikler fasulye enjekte edebilir. Bu, tekli fasulye, a solution can be found here içinde özellikle zor.
public class PropertiesProvider implements ApplicationContextAware{
private String propertyBeanName;
private ApplicationContext applicationContext;
public void setPropertyBeanName(final String propertyBeanName){
this.propertyBeanName = propertyBeanName;
}
@Override
public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException{
this.applicationContext = applicationContext;
}
public String getProperty(final String propertyName){
return ((Properties) applicationContext.getBean(propertyBeanName)).getProperty(propertyName);
}
}
olmaz mıydı bu yük tüm uygulama bağlamı: biryere arama yöntemleri enjekte etmek istemiyorsanız
, ayrıca böyle bir
PropertyProvider
fasulye enjekte edebilir? Biraz örnek paylaşır mısın? İlkbahar'a yeni geldim, bu yüzden yanılıyor olabilirim. Ayrıca tüm bahar uygulama içeriğini yeniden yüklemeyi düşündüm, ancak bu şu anda çalışan diğer süreçlerin kesintiye uğraması anlamına geliyordu. Ya da belki yanlış düşünüyorum! – SJoeHayır, haklısınız, tam bağlam yenilenir. –
Bu durumda, şu anda çalışan işlemimin kesintiye uğraması gerekmez. Benimki bir parti uygulamasıdır ve bir sürecin tamamlanması saatler sürebilir. Ayrıca, ilkbahar boyunca yapılandırılmış bir SchedularFactoryBean var. Sorum şu ki, Uygulama Bağlamını tamamen yeniden yüklersem, programlayıcı sıfırlanamaz mı? – SJoe