首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringApplication子类化

SpringApplication子类化
EN

Stack Overflow用户
提问于 2015-09-18 15:30:31
回答 1查看 256关注 0票数 0

为了执行递归引导,我对SpringApplication进行了子类化:

代码语言:javascript
复制
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...)调用它时它可以工作,但使用不同的运行,例如运行(Target.class),覆盖不会被应用。

我在这里做错了什么?

修正如下:

代码语言:javascript
复制
@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

    }

} 
EN

回答 1

Stack Overflow用户

发布于 2015-09-21 14:43:06

在查看了grepcode.com中的源代码后,我发现了这个问题。这个问题是SpringApplication中的一个bug。

只有args的run()方法是动态的,因此它将调用我覆盖的方法。

但是另外两个run()方法是静态的。这些代码实例化一个SpringApplication类对象,然后调用在该对象上运行。因此,我在ContextOverrideSpringApplication中的覆盖将被忽略。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32646303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档