设为首页 加入收藏

TOP

深入Spring Boot:Spring Context 的继承关系和影响(二)
2017-12-31 06:06:59 】 浏览:571
Tags:深入 Spring Boot Context 继承 关系 影响
ed=false,然后访问对应的url,就可以看到spring context的继承情况。

如何在应用代码里获取到 Management Spring Context

如果应用代码想获取到Management Spring Context,可以通过这个bean:org.springframework.boot.actuate.autoconfigure.ManagementContextResolver

spring boot在创建Management Spring Context时,就会保存到ManagementContextResolver里。

@Configuration
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
@ConditionalOnWebApplication
@AutoConfigureAfter({ PropertyPlaceholderAutoConfiguration.class,
        EmbeddedServletContainerAutoConfiguration.class, WebMvcAutoConfiguration.class,
        ManagementServerPropertiesAutoConfiguration.class,
        RepositoryRestMvcAutoConfiguration.class, HypermediaAutoConfiguration.class,
        HttpMessageConvertersAutoConfiguration.class })
public class EndpointWebMvcAutoConfiguration
        implements ApplicationContextAware, BeanFactoryAware, SmartInitializingSingleton {
      @Bean
        public ManagementContextResolver managementContextResolver() {
            return new ManagementContextResolver(this.applicationContext);
        }

        @Bean
        public ManagementServletContext managementServletContext(
                final ManagementServerProperties properties) {
            return new ManagementServletContext() {

                @Override
                public String getContextPath() {
                    return properties.getContextPath();
                }

            };
        }

如何在Endpoints代码里获取应用的Spring context

spring boot本身没有提供方法,应用可以自己写一个@Configuration,保存应用的Spring context,然后在endpoints代码里再取出来。

ApplicationContext.setParent(ApplicationContext) 到底发生了什么

从spring的代码就可以看出来,主要是把parent的environment里的propertySources加到child里。这也就是spring cloud config可以生效的原因。

// org.springframework.context.support.AbstractApplicationContext.setParent(ApplicationContext)
/**
 * Set the parent of this application context.
 * <p>The parent {@linkplain ApplicationContext#getEnvironment() environment} is
 * {@linkplain ConfigurableEnvironment#merge(ConfigurableEnvironment) merged} with
 * this (child) application context environment if the parent is non-{@code null} and
 * its environment is an instance of {@link ConfigurableEnvironment}.
 * @see ConfigurableEnvironment#merge(ConfigurableEnvironment)
 */
@Override
public void setParent(ApplicationContext parent) {
  this.parent = parent;
  if (parent != null) {
    Environment parentEnvironment = parent.getEnvironment();
    if (parentEnvironment instanceof ConfigurableEnvironment) {
      getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
    }
  }
}
// org.springframework.core.env.AbstractEnvironment.merge(ConfigurableEnvironment)

@Override
public void merge(ConfigurableEnvironment parent) {
  for (PropertySource<?> ps : parent.getPropertySources()) {
    if (!this.propertySources.contains(ps.getName())) {
      this.propertySources.addLast(ps);
    }
  }
  String[] parentActiveProfiles = parent.getActiveProfiles();
  if (!ObjectUtils.isEmpty(parentActiveProfiles)) {
    synchronized (this.activeProfiles) {
      for (String profile : parentActiveProfiles) {
        this.activeProfiles.add(profile);
      }
    }
  }
  String[] parentDefaultProfiles = parent.getDefaultProfiles();
  if (!ObjectUtils.isEmpty(parentDefaultProfiles)) {
    synchronized (this.defaultProfiles) {
      this.defaultProfiles.remove(RESERVED_DEFAULT_PROFILE_NAME);
      for (String
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用 yaml+groovy 实现 Java 代码.. 下一篇分布式实时日志分析解决方案 ELK ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目