前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >了解 SpringBoot 的内部工作原理

了解 SpringBoot 的内部工作原理

作者头像
默存
发布2024-05-30 16:44:29
660
发布2024-05-30 16:44:29
举报
文章被收录于专栏:默存默存

今天,我们将深入研究 SpringBoot 的机制,揭开其工作原理的奥秘,并阐明 SpringBoot 自动配置的本质。

下面是 SpringBoot 应用程序主类的简单示例。此示例演示了 SpringBoot 应用程序的基本结构以及如何从 main 方法开始执行:

代码语言:javascript
复制
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

此示例中:

  • @SpringBootApplication 注解用于标记该类为主应用程序类,并且还包括附加注解,如 @Configuration@EnableAutoConfiguration@ComponentScan
  • main 方法为应用程序的起点。它用于 SpringApplication.run 引导 SpringBoot 应用程序。

实际的 SpringBoot 应用程序通常会包含其他组件、服务和配置,这个示例为你提供了一个了解 SpringBoot 应用程序基本结构的起点。

@SpringBootApplication 注解

@SpringBootApplication 注解是 SpringBoot 框架中一个非常强大的注解,旨在简化 Spring 应用的配置和引导,它结合了三种常用的注解:@Configuration@EnableAutoConfiguration@ComponentScan

@Configuration

该注解表明该类包含供 Spring 容器处理的配置方法,它可以替代基于 XML 的配置,提供一种在 Spring 应用程序中定义和配置 bean 的编程方法。

@EnableAutoConfiguration

此注解启用了 SpringBoot 的自动配置机制,自动配置会根据类路径上的库自动配置 Spring 应用程序,它通过提供合理的默认值来简化设置。

@ComponentScan

该注解告诉 Spring 扫描指定包中的组件,例如控制器、服务和存储库,它确保 Spring 发现并注册指定包内的 bean。

通过将这三个注解组合到 @SpringBootApplication 中,开发人员可以创建一个简洁而强大的主应用程序类。它不仅将该类标记为主配置类,而且还支持自动配置和组件扫描。这有助于减少样板代码并使 SpringBoot 应用程序高度可定制。

总而言之,@SpringBootApplication 作为一个方便、全面的注解,可以启动配置、自动配置和组件扫描过程,为构建和运行 SpringBoot 应用程序提供了坚实的基础。

@Conditional 注解

Spring 中的注解 @Conditional 是一种强大的机制,它允许开发人员根据特定条件有条件地启用或禁用 bean 和配置,它有助于根据指定的条件动态地定制应用程序上下文。工作原理如下:

条件注解

@Conditional 作为元注解发挥作用,对其他注解进行操作来建立 bean 创建或配置的条件。开发人员可以根据注入类路径上特定类的存在、属性的值或特定 bean 的存在等因素来定义条件。

条件类

一个常用的条件是 @ConditionalOnClass,它检查指定的类是否存在于类路径中。如果指定的类存在,则启用注解的 bean 或配置;否则,则跳过。

例如:

代码语言:javascript
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class MyConfiguration {
 
    @Bean
    @Conditional(ConditionalOnClassPresentCondition.class)
    public MyBean myBean() {
        return new MyBean();
    }
}

@ConditionalOnClassPresentCondition 是实现接口的自定义条件类 Condition,它检查类路径上是否存在特定类。

myBean 方法用 @Conditional(ConditionalOnClassPresentCondition.class) 注解,表示只有满足 MyBean 中指定的条件才会创建该 bean 。

以下是该类(ConditionalOnClassPresentCondition)的简化版本:

代码语言:javascript
复制
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
 
public class ConditionalOnClassPresentCondition implements Condition {
 
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        try {
            // 检查类路径上是否存在指定的类
            context.getClassLoader().loadClass("com.example.RequiredClass");

            // 如果存在,则满足条件
            return true; 
        } catch (ClassNotFoundException e) {
            // 如果不存在,则不满足条件
            return false; 
        }
    }
}

在此示例中,MyBean 仅当类 com.example.RequiredClass 存在于类路径中时才会创建,@Conditional 注解提供了一种灵活的方式来根据运行时条件控制 bean 或配置的创建。

SpringApplication.run() 方法

该方法对于 SpringBoot 应用程序至关重要,负责引导和启动 Spring 应用程序,它通常位于主应用程序类的 main 方法中。以下是此方法的作用概述:

引导应用程序

SpringApplication.run() 是引导 Spring 应用程序的入口点,它设置 Spring 应用程序上下文并初始化应用程序运行所需的各种组件。

启动嵌入式 Web 服务器

如果应用程序是 Web 应用程序,SpringApplication.run() 还会启动嵌入式 Web 服务器,SpringBoot 包含一个嵌入式 Web 服务器(如 Tomcat 或 Jetty),以简化部署和配置。

应用程序上下文初始化

该方法触发 Spring 应用程序上下文的初始化,包括扫描组件、配置 Bean 和设置环境。

自动配置

SpringBoot 的自动配置功能在此过程中发挥作用,它会根据类路径中存在的依赖项自动配置应用程序,这是一项简化设置并减少样板代码的关键功能。

应用事件

SpringApplication.run() 还管理各种应用程序事件的触发,这些事件可用于自定义初始化、监控或日志记录目的。

例如:

代码语言:javascript
复制
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class MyApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • @SpringBootApplication 用于表明该类是 SpringBoot 应用程序的主配置类。
  • SpringApplication.run(MyApplication.class, args) 初始化并启动 SpringBoot 应用程序,class 参数指定配置类,是 args 可以传递给应用程序的命令行参数。

这一行代码封装了设置 SpringBoot 应用程序的复杂过程,使开发人员能够以最少的配置轻松启动他们的应用程序。

当你看到 SpringApplication.run() 时,你不仅仅是在启动一个程序而是正在开启一段由 Spring 驱动的旅程,进入高效、精简的 Java 开发世界。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @SpringBootApplication 注解
  • @Conditional 注解
  • SpringApplication.run() 方法
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档