2015-09-18 3 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)); 
     } 
    } 

} 

Когда я называю это, используя бег (арг ...) он работает, но с использованием другой перспективы, например, run (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.

Метод run() с просто args является динамическим, поэтому он будет вызывать мои переопределенные методы.

Но другие два метода run() являются статическими. Код для этих экземпляров создает объект класса SpringApplication, а затем вызывает на нем вызовы. Поэтому мои переопределения в ContextOverrideSpringApplication игнорируются.

Смежные вопросы