2015-09-18 49 views
0

我有子類,以執行遞歸引導SpringApplication:SpringApplication子類

package platform; 

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 
import org.springframework.beans.factory.support.DefaultListableBeanFactory; 
import org.springframework.boot.SpringApplication; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ConfigurableApplicationContext; 

public class ContextOverrideSpringApplication extends SpringApplication { 
    private ConfigurableApplicationContext overridingApplicationContext; 

    public ContextOverrideSpringApplication(Class src, ConfigurableApplicationContext overridingApplicationContext) { 
     super(src); 
     this.overridingApplicationContext = overridingApplicationContext; 
    } 

    @Override 
    protected void postProcessApplicationContext(ConfigurableApplicationContext context) { 

     Utils.mergeProperties(context.getEnvironment().getPropertySources(), 
       overridingApplicationContext.getEnvironment().getPropertySources(),true); 
     DefaultListableBeanFactory appBeanFact = (DefaultListableBeanFactory) context.getBeanFactory(); 
     ConfigurableListableBeanFactory ovrBeanFact = overridingApplicationContext.getBeanFactory(); 
     for (String beanName : ovrBeanFact.getBeanDefinitionNames()) { 
      if (appBeanFact.containsBeanDefinition(beanName)) { 
       appBeanFact.removeBeanDefinition(beanName); 
      } 
      appBeanFact.registerBeanDefinition(beanName,ovrBeanFact.getBeanDefinition(beanName)); 
     } 
    } 

} 

當我把這個使用運行(參數...)它的工作原理,但使用不同的運行,例如運行(Target.class),覆蓋不適用。

我在這裏做錯了什麼?

修訂:

@SpringBootApplication 
public class MySpringBootApplication { 
    public static String BOOT_STRAPPER_NAME = "bootStrapper"; 

    public static void main(String[] args) { 

     CommandLinePropertySource commandLinePropertySource = new SimpleCommandLinePropertySource(args); 
     MutablePropertySources mutProps = new MutablePropertySources(); 
     mutProps.addLast(commandLinePropertySource); 
     PropertySources propSources = mutProps; 

     Class target = MySpringBootApplication.class; 

     AnnotationConfigApplicationContext bootCtx = 
       new AnnotationConfigApplicationContext(); 
     bootCtx.scan(MySpringBootApplication.class.getPackage().getName()); 
     ConfigurableApplicationContext ctx = bootCtx; 

     while (ctx.containsBean(BOOT_STRAPPER_NAME)) { 
      // run the boot strapper 
      BootStrapper bootStrapper = (BootStrapper) ctx.getBeanFactory().getBean(BOOT_STRAPPER_NAME); 
      System.out.println("Running bootStrapper: " + bootStrapper.getClass().getTypeName()); 
      bootStrapper.setCallingContext(ctx); 
      bootStrapper.init(); 
      ctx = bootStrapper.getCalledContext(); 
     } 

     // initialise with overrides 
     ContextOverrideSpringApplication app = new ContextOverrideSpringApplication(target,ctx); 
     ctx = app.run(args); // can't use a config class here 

    } 

} 
+0

你可以指定兩個命令完全相同的使用! – Avis

+0

這個作品: ctx = app.run(args); –

+0

這不起作用(它給出了默認的SpringApplication類行爲,即使應用程序是ContextOverrideSpringApplication): ctx = app.run(Target.class); –

回答

0

我已經看着grepcode.com源後發現問題。這個問題是SpringApplication中的一個bug。

只有args的run()方法是動態的,因此它會調用我的重寫方法。

但其他兩個run()方法是靜態的。這些代碼實例化一個SpringApplication類對象,然後調用它。所以我在ContextOverrideSpringApplication中的覆蓋被忽略。