spring boot 默认不提供父子容器,仅使用单个 applicationcontext;但可通过 springapplicationbuilder 显式构建父子上下文层次,子上下文可访问父上下文 bean,而 web 组件须置于子上下文中以防 404。

Spring Boot 本身不提供传统意义上的父子容器(如 Spring MVC + Root WebApplicationContext 那种双上下文结构),它默认只使用一个 AnnotationConfigServletWebServerApplicationContext(或其变体)管理全部 Bean。但如果你确实需要多层 ApplicationContext 结构——比如隔离配置、复用父上下文 Bean、或模拟模块化启动逻辑——SpringApplicationBuilder 就是官方支持的流式构建方式,它本质是为创建**具有父子关系的 ApplicationContext 层次**而设计的工具。
明确前提:父子容器 ≠ 多模块工程
先划清边界:Maven 多模块(parent pom + child modules)和 Spring 的父子容器(parent context + child context)是两套独立机制。多模块是编译/构建层面的组织,父子容器是运行时 IoC 容器的嵌套关系。Spring Boot 默认不启用父子容器,但 SpringApplicationBuilder 可显式开启它。
用 SpringApplicationBuilder 构建父子上下文
核心在于链式调用 parent() 和 child() 方法。每个 child() 调用都会创建一个子上下文,其 parent 指向前一个上下文(或显式指定的 parent)。示例如下:
- 最简父子结构:一个父上下文加载基础配置(如数据源、事务、通用 service),一个子上下文加载 Web 层(Controller、WebMvcConfigurer)
new SpringApplicationBuilder()
.sources(RootConfig.class) // 父上下文配置类(不含 @EnableWebMvc)
.bannerMode(Banner.Mode.OFF)
.run(args)
.getApplicationContext() // 获取父上下文
.getBeanFactory()
.registerSingleton("parentApp", "ok"); // 父上下文中注册 Bean
new SpringApplicationBuilder()
.sources(WebConfig.class) // 子上下文配置类(含 @EnableWebMvc)
.parent(parentContext) // 显式指定父上下文
.run(args); // 启动子上下文
-
更典型的链式写法(推荐):直接用
child()构建层次
ApplicationContext context = new SpringApplicationBuilder()
.sources(ParentApplication.class) // 父上下文主类(@Configuration + @ComponentScan)
.child(ChildApplication.class) // 子上下文主类(同样标注 @SpringBootApplication)
.bannerMode(Banner.Mode.OFF)
.run(args);
此时 context 是子上下文实例,可通过 context.getParent() 获取父上下文;子上下文能访问父上下文中的所有 Bean,反之不行。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
关键限制与注意事项
这种结构不是“开箱即用”的常规模式,需特别注意以下约束:
- Web 组件(如
@Controller、@RestController)必须放在子上下文中,否则DispatcherServlet扫描不到,请求返回 404 - 父、子上下文共享同一个
Environment实例,所以配置属性(@Value、@ConfigurationProperties)全局可见 - 不能混用自动配置类:比如
DataSourceAutoConfiguration若在父上下文中生效,子上下文无需重复触发;但若子上下文也扫描了 starter,可能引发重复注册异常 - AOP 和事务代理 Bean 必须在定义它们的上下文中被引用:若事务切面在父上下文,而 service bean 在子上下文,代理将不生效 —— 因为代理发生在 bean 创建时,跨上下文不成立
替代思路:更现代、更轻量的分层方案
绝大多数场景下,你并不真正需要父子容器。Spring Boot 推荐用以下方式替代:
-
@Profile + 条件装配:用
@Profile("web")/@Profile("core")控制不同 Bean 的加载范围 - 自定义 Starter + 自动配置分离:把数据访问、安全、消息等能力封装成独立 starter,在不同模块中按需引入
-
多 Config 类 + @Import:通过 Java Config 组织逻辑分层,再由单一
@SpringBootApplication统一加载,保持单上下文简洁性
父子容器适合极少数强隔离需求,比如插件系统、沙箱环境或遗留系统集成。日常开发中,优先用清晰的包结构、接口抽象和依赖注入来实现分层,而非容器嵌套。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










