首页 > Java > java教程 > Spring-:How-spring-boot-determines-application-context

Spring-:How-spring-boot-determines-application-context

Susan Sarandon
发布: 2025-01-29 16:08:09
原创
385 人浏览过

spring-: how-spring-boot-determines-application-context

Spring Boot 自动确定 Application Context 的实现方式

调用 SpringApplication.run(MySpringBootApp.class, args); 时,Spring Boot 会根据以下因素自动确定正确的 ApplicationContext 实现:

  1. 类路径 (项目中存在的依赖)
  2. 运行的应用程序类型 (Web 或非 Web)

确定过程

SpringApplication 内部使用以下逻辑选择合适的 ApplicationContext:

  • 如果存在 Spring MVC 或 Spring WebFlux (依赖项中包含 spring-boot-starter-web 或 spring-boot-starter-webflux):

    • 它会初始化一个基于 Web 的应用程序上下文:
    • 基于 Servlet 的 (存在 spring-boot-starter-web):AnnotationConfigServletWebServerApplicationContext (用于带有嵌入式 Tomcat、Jetty 或 Undertow 的 Spring MVC 应用程序)。
    • 反应式 (存在 spring-boot-starter-webflux):AnnotationConfigReactiveWebServerApplicationContext (用于 WebFlux 应用程序)。
  • 如果既不存在 spring-boot-starter-web 也不存在 spring-boot-starter-webflux:

    • 它会初始化一个非 Web 应用程序上下文: → AnnotationConfigApplicationContext

Web 应用程序上下文示例

<code class="language-java">@SpringBootApplication
public class WebApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(WebApplication.class, args);
        System.out.println("Context Type: " + context.getClass().getName());
    }
}</code>
登录后复制

如果包含 spring-boot-starter-web,输出将为:

<code>Context Type: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext</code>
登录后复制

非 Web 应用程序上下文示例

如果移除 spring-boot-starter-web,输出将变为:

<code>Context Type: org.springframework.context.annotation.AnnotationConfigApplicationContext</code>
登录后复制

初始化 Application Context 的重要性

应用程序上下文核心容器,它管理 Spring Boot 应用程序中 Bean 的生命周期和配置。初始化它对于以下原因至关重要:

1. Bean 管理

  • 应用程序上下文注册和管理 Bean,允许依赖注入 (@Autowired)。
  • 没有应用程序上下文,Spring 将不知道如何实例化和注入依赖项。

2. 自动配置

  • @EnableAutoConfiguration 机制依赖于应用程序上下文。
  • 它扫描类路径并根据依赖项自动配置 Spring 组件。

3. 生命周期和事件管理

  • 应用程序上下文发布生命周期事件 (ApplicationReadyEventApplicationStartedEvent)。
  • 它侦听关机信号并正确管理资源。

4. 嵌入式 Web 服务器支持

  • 对于 Web 应用程序,应用程序上下文启动嵌入式服务器(Tomcat、Jetty、Undertow)。
  • 没有它,Spring Boot无法处理 HTTP 请求

5. 环境和属性管理

  • 上下文从 application.propertiesapplication.yml 加载配置属性
  • 它管理配置文件 (@Profile) 和特定于环境的设置。

选择正确的 Application Context 的实际影响

选择正确的应用程序上下文会影响应用程序的行为方式,具体如下:

1. 确定是否启动嵌入式 Web 服务器

  • 如果选择了错误的上下文,您的应用程序可能无法作为 Web 应用程序启动
  • Web 应用程序需要 AnnotationConfigServletWebServerApplicationContext,它引导 Tomcat/Jetty。

2. 控制组件扫描和依赖注入

  • 上下文仅在其范围内初始化和注入依赖项。
  • 例如,非 Web 上下文不会扫描或初始化控制器(@RestController 将不起作用)。

3. 启用或禁用自动配置

  • Spring Boot 根据所选上下文自动应用配置
  • 例如:如果选择了 Web 上下文,Spring Boot 会自动配置 MVC 组件。

4. 影响 Bean 的管理和加载方式

  • Web 上下文预配置 DispatcherServlet,它处理 HTTP 请求。
  • 非 Web 上下文没有,这意味着如果没有额外的配置,您将无法处理 Web 请求

总结

方面 Application Context 的影响
Bean 管理 初始化和管理依赖项 (`@Autowired`)
Web 服务器 启动嵌入式 Tomcat/Jetty(如果为 Web 上下文)
自动配置 根据类路径应用自动配置
生命周期管理 处理启动/关机事件
配置文件和环境 加载属性,管理配置文件 (`@Profile`)
依赖注入范围 确定哪些 Bean 和控制器可用
---

最后的想法

  • Spring Boot 会根据类路径自动选择正确的应用程序上下文
  • Web 应用程序需要基于 Web 的上下文 (AnnotationConfigServletWebServerApplicationContext)。
  • 非 Web 应用程序使用标准的基于注解的上下文 (AnnotationConfigApplicationContext)。
  • 初始化正确的上下文可确保正确的依赖注入、自动配置和生命周期管理。?

以上是Spring-:How-spring-boot-determines-application-context的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板