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
}
}
你可以指定兩個命令完全相同的使用! – Avis
這個作品: ctx = app.run(args); –
這不起作用(它給出了默認的SpringApplication類行爲,即使應用程序是ContextOverrideSpringApplication): ctx = app.run(Target.class); –