Spring boot 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

为了执行递归引导,我对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(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);你能分享你的完整代码(你调用运行的方法)来模拟这个问题吗!!!