Spring Boot支持一种指定Spring应用程序上下文层次结构的简单方法。
这篇文章只是演示了此功能,我尚未在我从事的项目中很好地使用它。 Spring Cloud使用此功能来创建引导上下文 ,在该上下文中,如果需要,可以从外部配置服务器加载属性,该属性稍后可用于主应用程序上下文。
为了快速退后一步, Spring Application Context管理着向其注册的所有bean的生命周期。 应用程序上下文层次结构提供了一种重用bean的方法,可以在子上下文中访问在父上下文中定义的bean。
考虑使用多个应用程序上下文和应用程序上下文层次结构的人为设计用例–这是为两个不同的端口提供两个不同的端口,这些端口在每个端口处具有不同的端点集。
Child1和Child2是典型的Spring Boot应用程序,遵循以下原则:
package child1;import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import root.RootBean;@SpringBootApplication
@PropertySource("classpath:/child1.properties")
public class ChildContext1 {@Beanpublic ChildBean1 childBean(RootBean rootBean, @Value("${root.property}") String someProperty) {return new ChildBean1(rootBean, someProperty);}
}
每个应用程序都驻留在其自己的根包中,以避免在扫描bean时发生冲突。 请注意,子上下文中的Bean依赖于预期来自根上下文的Bean。
要监听的端口是作为属性提供的,因为我们希望这两个上下文可以在不同的端口上进行监听,所以我已经明确指定了要加载的属性文件,其中包含以下内容:
server.port=8080
spring.application.name=child1
有了这个设置,Spring Boot提供了一个流畅的接口来加载根上下文和两个子上下文:
SpringApplicationBuilder appBuilder =new SpringApplicationBuilder().parent(RootContext.class).child(ChildContext1.class).sibling(ChildContext2.class);ConfigurableApplicationContext applicationContext = appBuilder.run();
SpringBootApplicationBuilder返回的应用程序上下文似乎是链中的最后一个,通过上面的ChildContext2定义。
如果现在启动应用程序,则将存在带有两个不同子上下文的根上下文,每个子上下文均通过不同的端口公开端点。 通过/ beans执行器端点的可视化显示如下:
但是,并非所有事情都是干净的,控制台中显示了与导出jmx端点有关的错误,但是这些信息仅供参考,似乎不会影响启动。
样本可以在我的github仓库中找到
翻译自: https://www.javacodegeeks.com/2016/12/spring-boot-application-context-hierarchy.html