1
我預先使用配置類(模擬)初始化服務定位器(Singleton)中的AnnotationConfigApplicationContext(註冊+刷新)。AnnotationConfigApplicationContext註冊並刷新另一個配置類
當我開始我的應用程序時,我設置了一個配置類屬性。我想替換已經註冊的配置類並重新加載我的配置。由於「刷新」方法可以使用一次,有可能或者我可以直接在init中設置正確的配置類嗎?
配置類1
@Configuration
@ComponentScan(basePackages = { "com.xxx.core.service.ws.controller" })
@EnableWebMvc
public class ContextCoreMockConfiguration {
}
配置類2
@Configuration
@EnableTransactionManagement
@ImportResource(value={ "classpath:sessionFactory-datasource-spring.xml"})
@ComponentScan(basePackages = { "com.xxx.core.service.impl"
, "com.xxx.core.dao.impl" })
public class ContextCoreServiceConfiguration {
}
的Singleton初始化上下文
public class AnnotationContextCoreLocator {
private AnnotationConfigApplicationContext context; // Context IOC
private AnnotationContextCoreLocator() {
this.context = new AnnotationConfigApplicationContext();
this.context.register(ContextCoreMockConfiguration.class);
this.context.refresh();
}
/**
* Context
* @return AnnotationConfigApplicationContext
*/
public static AnnotationConfigApplicationContext getInstance() {
return SingletonHolder.INSTANCE.getContext();
}
/**
* singleton instanciation
* @author asi
*
*/
private static class SingletonHolder {
static final AnnotationContextCoreLocator INSTANCE = new AnnotationContextCoreLocator();
}
private AnnotationConfigApplicationContext getContext() {
return context;
}
}
的想法是能夠在運行時改變配置類的Singleton
的String configCoreClass = servlet.getInitParameter("contextCoreConfigurationClass");
AnnotationContextCoreLocator.getInstance().register(Class.forName(configCoreClass));
AnnotationContextCoreLocator.getInstance().refresh();
問題是「刷新」方法可以使用一次。我可以從我的Singleton中刪除「刷新」並在第一次使用時執行它,但是我想在運行時更改注入。
請共享代碼。 – Mithun
我覺得你需要重新思考刷新現有上下文的整個想法。如果某個特定的bean已經被注入到某個地方了,那麼使用不包含該bean的配置重新初始化上下文。你期望會發生什麼? –