news 2026/5/1 7:57:00

SpringBoot 原理专题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot 原理专题

优先级与打包

  1. 命令行参数
  2. 系统环境
  3. properties
  4. yml
  5. yaml

打包插件

<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.example.DemoApplication</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>

打包后运行,带额外参数

java -Dserver.port=9000 -jar dd.jar

Bean 作用域

作用域说明
singleton容器内同 名称 的 bean 只有一个实例(单例)(默认)
prototype每次使用该 bean 时会创建新的实例(非单例/多例)
request每个请求范围内会创建新的实例(web环境中,了解)
session每个会话范围内会创建新的实例(web环境中,了解)
application每个应用范围内会创建新的实例(web环境中,了解)

配置 Scope 注解,选择单例

  • Lazy 表示延迟加载,默认是启动时加载,配置后表示延迟到第一次使用加载
  • SCOPE_SINGLETON 单例
  • SCOPE_PROTOTYPE 非单例

@Lazy @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) @RestController public class BasicController {}

注意:

  1. 单例是无状态的,多例是有状态的。
  2. 单例是节约资源,提升性能
  3. 单例bean:如果是无状态的bean,内部不保存任何状态信息,则是线程安全的。
  4. 单例bean:如果是有状态的bean,内部会保存状态信息,多个线程会同时操作该bean时,可能会出现数据不一致的问题,这样的bean则是线程不安全的。

起步依赖

依赖,具有传递性。

自动配置

SpringBoot的自动配置就是当spring项目启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

比如:引入了redis依赖,可以直接注入Redis使用。

实现方案一

加入另一个项目的依赖,引入依赖,并在主类上加上包扫描,扫描该依赖的包,不推荐,原因是操作麻烦+性能低

实现方案二

类不需要加任何注解,直接使用 Import 导入,或者使用Imort 导入一个配置类。

@Import(TokenService.class) @SpringBootApplication public class DemoApplication {

配置类代码

public class MyImportSelector implements ImportSelector { // 返回多个类的全限定命名 @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.example.aop.RecordTimeAspect2"}; } }

实现方案三:加注解的方式,最实用

// 核心还是用方式二 @Import(MyImportSelector.class) @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface EnableHeaderConfig { }

条件判断 / 自动配置

有时候我们经常需要判断该类应不应该注入到IOC容器中。

  • 作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中。

  • 位置:方法、类

  • @Conditional 本身是一个父注解,派生出大量的子注解:

  • @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。

  • @ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称) ,才注册bean到IOC容器。

  • @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

@Bean // 判断环境中是否存在io.jsonwebtoken.Jwts,如果有就创建该Bean @ConditionalOnClass(name = "io.jsonwebtoken.Jwts") // 判断环境中是否存在该类,如果没有就创建该Bean @ConditionalOnMissingBean // 判断属性值是否为true,在配置文件中 @ConditionalOnProperty(name = "enable", havingValue = "true") public RecordTimeAspect2 recordTimeAspect2(){ return new RecordTimeAspect2(); }

自己定义自动配置类的核心是什么? 如何完成自动配置?

  1. 定义自动配置类
  2. 将自动配置类配置在 META-INF/spring/
  3. org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中

自定义Starter

需求:自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类 AliyunOSSOperator 的自动配置。

目标:引入起步依赖引入之后,要想使用阿里云OSS,注入 AliyunOSSOperator 直接使用即可。

步骤:

  1. 创建aliyun-oss-spring-boot-starter模块
  2. 创建aliyun-oss-spring-boot-autoconfigure模块,在starter中引入该模块
  3. 在aliyun-oss-spring-boot-autoconfigure模块中的定义自动配置功能,并定义自动配置文件 META-INF/spring/xxxx.imports

注意:选择一个版本,无需要选依赖

只需要依赖是 spring-boot-starter 就可以。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 帮助yaml提示 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>

@Configuration @EnableConfigurationProperties(OSSProperties.class) // 引入配置类 public class OSSConfig { @Bean public OSS endpoint(OSSProperties ossProperties) { DefaultCredentialProvider defaultCredentialProvider = new DefaultCredentialProvider(ossProperties.getAccessKeyId(), ossProperties.getSecretAccessKey()); ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); return OSSClientBuilder.create() .endpoint("https://" + ossProperties.getEndpoint()) .credentialsProvider(defaultCredentialProvider) .clientConfiguration(clientBuilderConfiguration) .region(extractRegion(ossProperties.getEndpoint())) .build(); } /** * 获取 region */ private String extractRegion(String endpoint) { if (endpoint == null) return null; int start = endpoint.indexOf("oss-"); int end = endpoint.indexOf(".aliyuncs.com"); if (start == -1 || end == -1 || start + 4 >= end) throw new IllegalArgumentException("Invalid endpoint: " + endpoint); return endpoint.substring(start + 4, end); } }

@Data @ConfigurationProperties(prefix = "aliun.oss") public class OSSProperties { private String endpoint; private String accessKeyId; private String secretAccessKey; }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:52:20

2026变现才是硬道理!打破“生殖隔离”,一起做个“双刀流”

你好吖&#xff0c;我是晓衡&#xff01;今天是2026年的第一个星期一&#xff0c;不知道你的的“开工状态”如何&#xff1f;今天下午&#xff0c;我把自己关在房间里&#xff0c;干了一件在很多人看来有点“离经叛道”的事。作为一个深耕 Cocos 生态多年的老司机&#xff0c;我…

作者头像 李华
网站建设 2026/5/1 8:46:12

Docker健康检查最佳实践(从入门到精通,架构师私藏手册)

第一章&#xff1a;Docker健康检查概述与核心价值在现代容器化应用部署中&#xff0c;服务的稳定性与可用性至关重要。Docker 健康检查&#xff08;Health Check&#xff09;机制为容器运行状态提供了主动监测能力&#xff0c;能够判断应用是否真正处于可服务状态&#xff0c;而…

作者头像 李华
网站建设 2026/4/15 9:27:29

Docker容器状态监控实战(从入门到精通的9大技巧)

第一章&#xff1a;Docker容器状态监控概述在现代云原生架构中&#xff0c;Docker 容器的运行状态直接影响应用的可用性与性能。对容器进行实时、精准的状态监控&#xff0c;是保障系统稳定运行的关键环节。通过监控&#xff0c;运维人员能够及时发现异常容器、分析资源使用趋势…

作者头像 李华
网站建设 2026/4/18 23:04:17

社区贡献激励计划启动:鼓励用户提交优质提示模板

VibeThinker-1.5B&#xff1a;小模型如何实现高推理能力&#xff1f;从技术解析到社区共建 在当前大语言模型“军备竞赛”愈演愈烈的背景下&#xff0c;百亿、千亿参数已成为常态。然而&#xff0c;随着算力成本飙升和部署门槛抬升&#xff0c;越来越多开发者开始反思&#xff…

作者头像 李华
网站建设 2026/4/30 18:35:07

【云原生安全专家私藏】:构建企业级Docker威胁检测的Falco规则库

第一章&#xff1a;企业级Docker威胁检测的挑战与Falco定位在现代云原生架构中&#xff0c;Docker等容器技术被广泛应用于微服务部署与资源隔离。然而&#xff0c;容器环境的动态性、短暂性和共享内核特性&#xff0c;给传统安全监控手段带来了严峻挑战。攻击者可利用容器逃逸、…

作者头像 李华
网站建设 2026/4/23 16:09:49

教育科技融合创新:打造基于VibeThinker的互动学习平台

教育科技融合创新&#xff1a;打造基于VibeThinker的互动学习平台 在编程竞赛训练营里&#xff0c;一个学生盯着屏幕上那道图论题已经半小时了——他知道该用最短路径算法&#xff0c;但边界条件总处理不好。他点开学习平台的AI助手&#xff0c;输入问题&#xff0c;不到十秒&…

作者头像 李华