手写模拟Spring Boot自动配置功能

简介: 【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。

引言

随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。本文将从背景历史、业务场景、功能点、底层原理等方面详细介绍Spring Boot的自动配置功能,并通过Java代码手写模拟这一功能,为资深Java工程师提供一个深入理解和实践的机会。

一、背景历史

Spring Boot的起源与发展

Spring Boot最初基于Spring 4.0设计,由Pivotal公司提供。其诞生背景是Spring框架在开发过程中存在大量的XML配置以及复杂的依赖管理,导致开发效率低下。为了解决这一问题,Pivotal团队在2013年开始研发Spring Boot项目,并于2014年4月发布了Spring Boot 1.0.0版本。此后,Spring Boot不断迭代更新,引入了更多便捷的功能和性能优化,成为了Java开发中构建微服务应用的首选框架之一

自动配置的引入

自动配置是Spring Boot的核心特性之一,它通过推断应用所需的配置,自动为应用程序注册合适的Bean,从而简化了繁琐的手动配置过程。自动配置的引入,使得开发者无需再编写大量的XML或Java配置文件,只需关注业务逻辑的实现即可

二、业务场景

微服务架构

在微服务架构中,每个服务都是一个独立的应用程序,需要快速搭建和部署。Spring Boot的自动配置功能使得开发者可以快速创建一个功能完整的微服务应用,无需关注底层框架的配置细节,从而提高了开发效率

Web应用程序开发

对于Web应用程序开发而言,Spring Boot提供了丰富的Web开发特性,如RESTful API、WebSocket等。通过自动配置,开发者可以快速搭建一个Web应用,无需手动配置Servlet容器、Spring MVC等组件

数据访问与缓存管理

在数据访问和缓存管理方面,Spring Boot集成了Spring Data JPA、Spring Data MongoDB等数据访问模块,以及Ehcache、Redis等缓存管理工具。通过自动配置,开发者可以方便地进行数据库操作和访问,以及提高应用程序的性能和可伸缩性

三、功能点

自动配置

Spring Boot的自动配置功能能够根据项目的依赖和环境自动设置Spring应用程序,减少了手动配置的复杂度。例如,当项目中引入了spring-boot-starter-web依赖时,Spring Boot会自动配置Tomcat和Spring MVC等组件

起步依赖

起步依赖是Spring Boot提供的一组预定义的依赖集合,包含了常用的库和框架的依赖关系。开发者只需在项目中添加相应的起步依赖,即可快速构建出一个功能完整的应用程序

嵌入式服务器

Spring Boot内置了Tomcat、Jetty和Undertow等多个服务器,使得应用程序可以打包成一个可执行的JAR文件,直接运行而无需外部Web服务器

外部化配置

Spring Boot支持外部化配置,允许开发者通过配置文件、环境变量等方式灵活地配置应用程序。这使得应用程序的配置更加灵活和可维护,便于在不同环境中进行部署和配置

四、底层原理

核心组件与注解

@SpringBootApplication

@SpringBootApplication是一个复合注解,它结合了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解的功能。这个注解通常被用在主启动类上,用于开启Spring Boot的自动配置和组件扫描

  • @Configuration:表示该类是一个配置类,相当于传统的Spring XML配置文件。在配置类中,可以通过@Bean注解来定义和注册Bean
  • @EnableAutoConfiguration:告诉Spring Boot根据添加的jar依赖来自动配置项目。例如,如果添加了spring-boot-starter-web依赖,Spring Boot会自动配置Tomcat和Spring MVC
  • @ComponentScan:让Spring Boot自动扫描当前包及其子包中的@Component、@Repository、@Service、@Controller等注解的类,并将它们注册为Bean

SpringApplication类

SpringApplication类是Spring Boot的启动类,它负责启动整个Spring应用上下文。在main方法中,通过调用SpringApplication.run(Application.class, args)方法来启动Spring Boot应用

启动流程

Spring Boot的启动流程可以概括为以下几个步骤:

  1. 读取配置文件:SpringBoot默认会在resources文件夹下读取application.properties或application.yml配置文件,这些配置文件包含了应用的各种配置信息
  2. 初始化Spring应用上下文:在main方法中,通过调用SpringApplication.run(Application.class, args)方法来初始化Spring应用上下文。这个过程包括装配参数和环境、创建ApplicationContext、注册各种组件等
  3. 自动配置:SpringBoot会根据添加的jar依赖和配置文件中的信息来自动配置项目。这个过程是通过@EnableAutoConfiguration注解来实现的,它会根据类路径中的jar依赖为项目进行自动配置
  4. 组件扫描与注册:@ComponentScan注解会让SpringBoot自动扫描当前包及其子包中的注解类,并将它们注册为Bean。这些Bean会被存储在Spring的IoC容器中,供后续使用
  5. 发布事件:在SpringBoot启动过程中,会发布多个事件,如ApplicationStartedEvent、ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent和ApplicationReadyEvent等。这些事件可以被自定义的监听器捕获和处理,以实现一些自定义的启动逻辑

自动配置的实现机制

Spring Boot的自动配置是通过Spring框架的条件化注解实现的。具体来说,Spring Boot会根据类路径中的依赖项、已声明的Bean以及其他上下文信息,自动为应用程序注册合适的Bean

条件化注解

Spring Boot提供了多个条件化注解,用于在特定条件下启用或禁用自动配置:

  • @ConditionalOnClass:当类路径中存在指定的类时,才会启用相应的自动配置
  • @ConditionalOnMissingBean:当容器中没有指定的Bean时,才会应用配置
  • @ConditionalOnProperty:根据配置文件中的某个属性是否启用,决定是否加载该配置

自动配置类

自动配置类通常位于spring-boot-autoconfigure模块中,它们会根据配置文件和类路径中的jar依赖来自动配置项目的各种组件。例如,DataSourceAutoConfiguration类会根据类路径中的数据库驱动以及配置文件中的数据库连接信息自动配置数据源

spring.factories文件

META-INF/spring.factories文件是Spring Boot自动配置的重要部分,它定义了自动配置类的加载路径。Spring Boot在启动时会扫描此文件中的配置,并将其加载到Spring容器中

五、手写模拟Spring Boot自动配置功能

下面,我们将通过Java代码手写模拟Spring Boot的自动配置功能。

1. 定义自动配置属性类

首先,我们定义一个自动配置属性类,用于存储配置信息。这个类将使用@ConfigurationProperties注解进行标记,以便Spring Boot能够将其属性与配置文件中的值进行绑定。

java复制代码
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "my.config")
public class MyConfigProperties {
private String name = "defaultName";
private int age = 18;
// Getter and Setter methods
public String getName() {
return name;
    }
public void setName(String name) {
this.name = name;
    }
public int getAge() {
return age;
    }
public void setAge(int age) {
this.age = age;
    }
}

2. 创建自动配置类

接下来,我们创建一个自动配置类,该类将使用条件化注解来判断是否需要自动配置某个Bean。

java复制代码
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnClass(MyConfigProperties.class)
@EnableConfigurationProperties(MyConfigProperties.class)
public class MyAutoConfiguration {
private final MyConfigProperties properties;
public MyAutoConfiguration(MyConfigProperties properties) {
this.properties = properties;
    }
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyService(properties.getName(), properties.getAge());
    }
}

3. 定义服务类

然后,我们定义一个服务类,该类将作为自动配置的Bean。

java复制代码
public class MyService {
private String name;
private int age;
public MyService(String name, int age) {
this.name = name;
this.age = age;
    }
public String saySomething() {
return "My name is " + name + ", and I am " + age + " years old.";
    }
}

4. 在META-INF/spring.factories文件中声明自动配置类

最后,我们需要在META-INF/spring.factories文件中声明自动配置类,以便Spring Boot能够自动加载它。

复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

5. 编写主应用类

现在,我们可以编写主应用类来启动Spring Boot应用,并测试自动配置功能。

java复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MySpringBootApplication {
@Autowired
private MyService myService;
public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
@Bean
public CommandLineRunner commandLineRunner() {
return args -> System.out.println(myService.saySomething());
    }
}

6. 编写配置文件

在src/main/resources目录下创建application.properties文件,并添加以下配置信息:

复制代码
my.config.name=myName
my.config.age=30

7. 运行应用

现在,我们可以运行主应用类MySpringBootApplication,观察自动配置功能是否生效。如果一切配置正确,控制台将输出以下信息:

复制代码
My name is myName, and I am 30 years old.

这表明MyService Bean已经成功通过自动配置创建,并且其属性值与配置文件中的值一致。

六、总结

通过本文的介绍,我们深入了解了Spring Boot自动配置的背景历史、业务场景、功能点以及底层原理。同时,我们还通过Java代码手写模拟了Spring Boot的自动配置功能,展示了如何实现一个简单的自动配置类。希望本文能够帮助资深Java工程师更好地理解和应用Spring Boot的自动配置功能,提高开发效率和质量。

相关文章
|
6天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
10天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
1天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
7天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
17天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3937 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
6天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
512 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
13天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
988 3
|
10天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
430 18
白话文讲解大模型| Attention is all you need
|
5天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
10天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
562 5