网站优化建设深圳/竞价推广代运营企业

网站优化建设深圳,竞价推广代运营企业,做任务赚q币网站,公司做网站推广需要多少钱目录 一 自动配置 1:数据源的手动配置 1:SpringBoot的自动配置 二 自动配置的完整流程:(底层) 1. 场景化依赖与Starter机制 2. 主程序入口与注解驱动 3. 自动配置类的加载与筛选 4. 自动配置类的实现逻辑 5. 自动配置的触发与执行流…

目录

一 自动配置

1:数据源的手动配置

1:SpringBoot的自动配置

二 自动配置的完整流程:(底层)

1. 场景化依赖与Starter机制

2. 主程序入口与注解驱动

3. 自动配置类的加载与筛选

4. 自动配置类的实现逻辑

5. 自动配置的触发与执行流程

6. 自动配置的优势

补充:关键配置文件与调试技巧

三 自动配置类的实现:

1. 启动类与核心注解

2. 加载自动配置类

3. 条件化装配

4. 配置属性绑定

5. 组件创建与注入

6. 结果整合

核心优势


概念

SpringBoot帮我们简单快速的创建一个独立的、生产级别的Spring应用;

1 核心特性

  1. 简化配置

    • 自动配置(Auto-Configuration):根据类路径中的依赖自动配置 Spring 应用。例如,引入 spring-boot-starter-data-jpa 后,Spring Boot 会自动配置数据源和 JPA 相关 Bean。

    • 外部化配置:支持通过 application.properties/application.yml、环境变量或命令行参数灵活配置应用,并支持多环境(如 dev/prod)配置。

  2. 内嵌服务器

    • 默认集成 Tomcat,也可选择 Jetty 或 Undertow。无需部署 WAR 包,直接打包为可执行 JAR 文件,通过 java -jar 命令运行。

  3. 起步依赖(Starter Dependencies)

    • 提供预定义的依赖集合(如 spring-boot-starter-web 包含 Spring MVC、Tomcat 等),简化 Maven/Gradle 依赖管理,避免版本冲突。

  4. 生产就绪功能(Spring Boot Actuator)

    • 提供监控和管理端点(如 /health/metrics),支持健康检查、性能指标收集和日志管理,便于运维。

  5. 开发者工具(DevTools)

    • 支持热部署、自动重启和实时重新加载,提升开发效率。

  6. 集成测试支持

    • 提供 @SpringBootTest 进行全栈集成测试,以及 @WebMvcTest@DataJpaTest 等切片测试注解,简化测试流程。

一 自动配置

手动配置大于自动配置 

概念:基于项目的依赖和类路径中的内容,自动配置 Spring 应用所需的组件

1:数据源的手动配置

<!--     导入druid的依赖   --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>

数据源配置(人为手动的引用配置文件当中的信息)

package org.example.springmvc.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DataSourceConfig {@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;@Value("${spring.datasource.driver-class-name}")private String driverClassName;@Value("${spring.datasource.url}")private String url;@Beanpublic DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);return dataSource;}}

1:SpringBoot的自动配置

当项目引入 Spring Boot 的数据库相关依赖(如 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa)时,Spring Boot 的自动配置机制会尝试根据以下逻辑处理数据库连接

  • 前提条件
    必须满足以下两点,Spring Boot 才会自动配置默认数据源(如 HikariCP):

    1. 项目中存在数据库驱动依赖(如 mysql-connector-java)。

    2. 配置文件中提供了 数据库连接四要素(URL、用户名、密码、驱动类名)

  • 默认行为:

        Spring Boot 会基于上述配置自动创建数据源(默认使用 HikariCP),无需手动编写 @Bean 配置类。

配置文件当中指定配置类型

这种不直接指定的默认Hikari

如果在配置文件当中指定

会使用你指定的类型

二 自动配置的完整流程:

关于Spring Boot的自动配置机制,我的理解可以总结为以下几个核心要点:


1. 场景化依赖与Starter机制

  • 场景选择:通过选择不同的Starter依赖(如spring-boot-starter-web),Spring Boot会自动引入该场景所需的全部依赖库(如Tomcat、Spring MVC、Jackson等)。这相当于声明了项目的功能需求,例如Web开发需要内嵌服务器和HTTP处理能力。

  • 依赖传递:所有Starter都继承自spring-boot-starter,它提供了核心库(如spring-core)、日志框架(SLF4J + Logback)以及自动配置的基础支持(spring-boot-autoconfigure)。


2. 主程序入口与注解驱动

  • @SpringBootApplication:这是组合注解,包含三个关键功能:

    1. @SpringBootConfiguration:标识当前类为配置类,等价于@Configuration,用于定义Bean。

    2. @EnableAutoConfiguration:启用自动配置的核心开关,触发AutoConfigurationImportSelector加载自动配置类。

    3. @ComponentScan:自动扫描当前包及其子包下的组件(@Component@Service等),将它们注册为Bean。


3. 自动配置类的加载与筛选

  • AutoConfigurationImportSelector:该类负责加载所有预定义的自动配置类。具体流程如下:

    1. 定位配置文件:从所有依赖的JAR包中查找META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。

    2. 批量导入配置类:读取文件中列出的全限定类名(如WebMvcAutoConfigurationDataSourceAutoConfiguration等)。

    3. 条件化筛选:每个自动配置类通过@Conditional系列注解(如@ConditionalOnClass@ConditionalOnMissingBean)判断是否生效。例如:

      • @ConditionalOnClass(DataSource.class):仅在类路径存在DataSource类时生效。

      • @ConditionalOnMissingBean(DataSource.class):仅在用户未手动定义DataSource Bean时生效。


4. 自动配置类的实现逻辑

  • 配置类结构:每个自动配置类(如DataSourceAutoConfiguration)通过@Bean方法定义组件,并配合条件注解控制是否生效。

  • 默认值设置:自动配置类会读取application.properties中的配置项(如spring.datasource.url),若用户未配置则使用合理的默认值。

  • 优先级规则:用户手动定义的Bean优先级高于自动配置类,实现灵活覆盖。


5. 自动配置的触发与执行流程

  1. 项目启动:执行主类的main方法,初始化Spring上下文。

  2. 加载自动配置类:通过AutoConfigurationImportSelector加载所有符合条件的配置类。

  3. 条件化装配:依次执行每个自动配置类,根据条件注解决定是否创建Bean。

  4. Bean注册:最终将所有符合条件的Bean注册到IoC容器中,完成依赖注入。


6. 自动配置的优势

  • 减少样板代码:无需手动配置DispatcherServletDataSource等通用组件。

  • 按需加载:仅加载与当前场景相关的配置类(如未引入Redis依赖,则相关配置类不生效)。

  • 高扩展性:用户可通过自定义Bean或配置文件覆盖默认行为。


补充:关键配置文件与调试技巧

  • 自动配置列表AutoConfiguration.imports文件中列出了所有自动配置类,位置在spring-boot-autoconfigure包的META-INF/spring目录下。

  • 调试日志:启动时添加-Ddebug参数,控制台会输出所有自动配置类的生效与排除原因,便于排查问题。

三句话概括:

  • 1 场景启动器一导入,就从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中导入一大堆自动配置类(类XxxAutoConfiguration)
  • 2 这些xxxAutoConfiguration基于@conditional条件注解导入一堆组件
  • 3 业务就可以使用这些组件了

类路径下的文件

三 自动配置类的实现:


1. 启动类与核心注解

项目启动时,主类上的 @SpringBootApplication 注解触发自动配置。该注解整合了三个核心功能:

  • 配置类声明:标记主类为Spring的配置类。

  • 组件扫描:自动探测并注册当前包下的组件(如Service、Controller)。

  • 启用自动配置:激活Spring Boot的自动配置机制。


2. 加载自动配置类

  • 自动配置列表:Spring Boot内置了上百个自动配置类(如DataSourceAutoConfigurationWebMvcAutoConfiguration),这些类定义在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中。

  • 按需加载:通过AutoConfigurationImportSelector筛选并加载这些配置类,但并非全部生效,需通过条件判断。


3. 条件化装配

每个自动配置类通过 @Conditional系列注解 控制是否生效,例如:

  • 存在类时生效:如检测到类路径中有DataSource类,才加载数据源配置。

  • 无自定义Bean时生效:若用户未手动定义某个Bean(如DataSource),才使用默认配置。

  • 配置属性匹配时生效:如根据spring.datasource.url是否存在决定是否初始化数据库连接。


4. 配置属性绑定

  • 属性映射:通过@ConfigurationProperties将配置文件(如application.properties)中的属性(如spring.datasource.url)绑定到Java对象。

  • 动态适配:自动配置类读取这些属性值,用于初始化组件(如数据库连接池的URL、用户名)。


5. 组件创建与注入

  • 默认Bean创建:自动配置类通过内部逻辑创建标准化的Bean(如DataSourceDispatcherServlet)。

  • 用户自定义优先:若用户手动定义了同名Bean(如自己写的@Bean DataSource),则覆盖默认实现。


6. 结果整合

所有生效的自动配置类共同作用,最终完成以下工作:

  • 依赖管理:根据项目引入的Starter(如spring-boot-starter-web)按需加载功能模块。

  • 组件装配:自动注册Bean到Spring容器,如内嵌Tomcat、JSON解析器、数据库连接池等。

  • 环境适配:结合配置文件中的参数,动态调整组件行为(如连接池大小、超时时间)。


核心优势

  • 开箱即用:无需手动配置常见功能(如Web服务器、数据库连接)。

  • 按需加载:仅初始化与当前依赖和配置匹配的功能模块,避免资源浪费。

  • 灵活扩展:用户可通过配置文件或自定义Bean轻松覆盖默认行为。

两句话:

  • 1 把属性类和配置列进行绑定
  • 2 组件要用的所有属性放到容器中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OJ题:移动零

双指针法 c 语言实现 void moveZeroes(int* nums, int numsSize) {int dest,cur; //创建临时指针和目标指针destcur0;//出初始化while(cur<numsSize)//遍历{if(nums[cur]!0){swap(&nums[cur],&nums[dest]);cur;dest;}else{cur;}}} 思路是建立两个指针&#xff0…

pycharm终端操作远程服务器

pycharm项目已经连接了远程服务器&#xff0c;但是打开终端&#xff0c;却依旧显示的是本地的那个环境&#xff0c;也就是说没有操作远程的那个环境。只能再使用Xshell去操作远程环境&#xff0c;很麻烦&#xff0c;找了下教程。 来源&#xff1a;https://blog.csdn.net/maolim…

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive编程:什么是Reactive编程?Reactive编程思想

文章目录 **1. Reactive编程概述****1.1 什么是Reactive编程&#xff1f;****1.1.1 Reactive编程的定义****1.1.2 Reactive编程的历史****1.1.3 Reactive编程的应用场景****1.1.4 Reactive编程的优势** **1.2 Reactive编程的核心思想****1.2.1 响应式&#xff08;Reactive&…

异步转同步,实现一个消息队列

有一个场景&#xff0c;需要实现一个消息队列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其实考察的是怎么用同步的方式实现异步。 本文总结了四种方式实现&#xff1a;常规嵌套、prom…

求职笔试题

PDD 最长公共子序列 1143-最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二维动态规划"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 这种写法错误&#xff0c;m1行…

Android 中实现一个自定义的 AES 算法

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 AES&#xff08;Advanced Encryption Standard&#xff0c;高级加密标准&#xff09; 是一种 对称加密算法&#xff0c;用于加密和解密数据。AES 由 美国…

小河:团队金牌精准计划

【趋势识别与预测】 数据趋势分析在随机序列研究中首要价值在于识别潜在规律并提升预测能力。随机序列常表现为无规则波动&#xff0c;但通过滑动平均、指数平滑、小波变换等方法&#xff0c;可剥离噪声干扰&#xff0c;提取长期趋势或周期性成分。例如&#xff0c;在金融时间序…

S32K144外设实验(七):FTM输出多路互补带死区PWM

文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…

数据结构与算法:算法分析

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为您提供一点帮助。 本篇参考《Data Structures and Algorithm Analysis in C》 “在程序设计中&#xff0c;不仅要写出能工作的程序&#xff0c;更要关注程序在大数据集上的运行时间。” 本章讨论要点&#xf…

排序--归并排序

一&#xff0c;引言 归并排序作为七大排序中一种&#xff0c;本文将讲解其排序原理和代码实现。 二&#xff0c;逻辑讲解 来看一组动图&#xff1a; 首先先进行大逻辑的讲解&#xff0c;在一个乱序的数组中如图&#xff1a; 通过递归进行一次次分组如图&#xff1a; 分组逻…

React程序打包与部署

===================== 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为生产环境准备React应用最小化和打包环境变量错误处理部署到托管服务部署到Netlify探索高级主题:Hooks、Su…

Spring Data审计利器:@LastModifiedDate详解(依赖关系补充篇)!!!

&#x1f552; Spring Data审计利器&#xff1a;LastModifiedDate详解&#x1f525;&#xff08;依赖关系补充篇&#xff09; &#x1f50c; 核心依赖解析 使用LastModifiedDate必须知道的依赖关系 #mermaid-svg-qm1OUa9Era9ktbeK {font-family:"trebuchet ms",verd…

接口测试中数据库验证,怎么解决?

在接口测试中&#xff0c;通常需要在接口调用前后查询数据库&#xff0c;以验证接口操作是否正确影响了数据库状态。​这可以通过数据库断言来实现&#xff0c;PyMySQL库常用于连接和操作MySQL数据库。​通过该库&#xff0c;可以在测试中执行SQL语句&#xff0c;查询或修改数据…

游戏引擎学习第189天

今天的回顾与计划 在昨天&#xff0c;我们花了一些时间来优化调试数据的收集方法&#xff0c;并且在调试界面中增加了一些界面代码&#xff0c;使得我们可以悬停在不同的元素上&#xff0c;查看相关信息。今天的任务是对这些数据进行更多的操作&#xff0c;进行一些有趣的实验…

智能粉尘监测解决方案|守护工业安全,杜绝爆炸隐患

在厂房轰鸣的生产线上&#xff0c;一粒微小粉尘的聚集可能成为一场灾难的导火索。如何实现粉尘浓度的精准监控与快速响应&#xff1f;我们为您打造了一套"感知-预警-处置"全闭环的智能安全方案&#xff01; 行业痛点&#xff1a;粉尘管理的生死线 在金属加工、化工…

Axure设计之中继器表格——拖动行排序教程(中继器)

一、原理介绍 在Axure中实现表格行的拖动排序&#xff0c;主要依赖于中继器的排序事件。然而要实现拖动效果&#xff0c;就必须结合动态面板&#xff0c;因为动态面板可以设置拖动事件&#xff0c;之所以使用动态面板或许是因为它可以更灵活地处理位置变化。用户拖动行时&…

分布式渲染与云渲染:技术与应用的黄金搭档

一、核心概念&#xff1a;先区分再关联 分布式渲染是通过多台设备并行计算拆分渲染任务的技术&#xff08;如将一帧拆分为 64 个小块&#xff0c;64 台电脑同时渲染&#xff09;&#xff1b; 云渲染是基于云计算的渲染服务&#xff0c;本质是分布式渲染的商业化落地—— 用户无…

鼠标在客户区内按下左键和双击右键

书籍&#xff1a;《Visual C 2017从入门到精通》的2.6鼠标 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.44】鼠标在客户区内按下左键和双击右键 1.创建一个单文档程序 一个简单的单文档程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…

【Java SE】包装类 Byte、Short、Integer、Long、Character、Float、Double、Boolean

参考笔记&#xff1a;java 包装类 万字详解&#xff08;通俗易懂)_java包装类-CSDN博客 目录 1.简介 2.包装类的继承关系图 3.装箱和拆箱 3.1 介绍 3.2 手动拆装箱 3.3. 自动拆装箱 ​4.关于String类型的转化问题 4.1 String类型和基本类型的相互转化 4.1.1 String —…