Spring boot SpringApplication子分类
为了执行递归引导,我对SpringApplication进行了子分类:Spring boot SpringApplication子分类,spring-boot,Spring Boot,为了执行递归引导,我对SpringApplication进行了子分类: package platform; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.Sprin
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(args…)调用它时,它可以工作,但使用不同的run(例如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
}
}
在查看了grepcode.com中的源代码后,我发现了这个问题。这个问题是SpringApplication中的一个bug 只包含args的run()方法是动态的,因此它将调用我的重写方法
但是其他两个run()方法是静态的。这些代码实例化一个SpringApplication类对象,然后调用该对象上的run。因此,我在ContextOverrideSpringApplication中的覆盖被忽略。您能准确地指定这两个命令吗!!!这是有效的:ctx=app.run(args);这不起作用(它给出了默认的SpringApplication类行为,即使app是ContextOverrideSpringApplication):ctx=app.run(Target.class);你能分享你的完整代码(你调用运行的方法)来模拟这个问题吗!!!