2015-04-08 27 views
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中刪除「刷新」並在第一次使用時執行它,但是我想在運行時更改注入。

+0

請共享代碼。 – Mithun

+0

我覺得你需要重新思考刷新現有上下文的整個想法。如果某個特定的bean已經被注入到某個地方了,那麼使用不包含該bean的配置重新初始化上下文。你期望會發生什麼? –

回答

0

因此,我發現onyl解決方案不是初始化單例中的上下文。但是當我的servlet啓動時進行設置。

辛格爾頓:

public class AnnotationContextCoreLocator { 
    private AnnotationConfigApplicationContext context; // Context IOC 

    private AnnotationContextCoreLocator() { 
     this.context = new AnnotationConfigApplicationContext(); 
     //this.context.register(ContextCoreMockConfiguration.class); 
     //this.context.refresh(); 
    } 

    ..... 

    } 

servlet初始化

String configCoreClass = servlet.getInitParameter("contextCoreConfigurationClass"); 
AnnotationContextCoreLocator.getInstance().register(Class.forName(configCoreClass)); 
AnnotationContextCoreLocator.getInstance().refresh();  
AdherentService adherentService = AnnotationContextCoreLocator.getInstance().getBean(AdherentService.class); 
... 
相關問題