当前位置: 首页 > news >正文

Spring—Springboot篇

SpringBoot

  • 版本要求

    1. SpringBoot稳定版本2.x,目前主流版本正在转向SpringBoot3.x
    2. Java稳定版本JDK8,目前主流版本正在转向JDK17
    3. maven版本要求3.6.7及以上
  • 标准pom.xml结构:如果使用阿里云脚手架建议修改为标准结构

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.2</version><relativePath /> <!-- lookup parent from repository --></parent><groupId>com.wyh</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>demo</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

启动流程

  • 大致流程

    1. 运行启动类:创建 SpringApplication 实例
    2. 加载 ApplicationListener 实例:监听应用生命周期的所有事件
    3. 准备运行环境:读取配置文件、命令行参数、系统属性等
    4. 创建并配置 ApplicationContext:创建应用上下文
    5. Bean 初始化:加载IOC,执行依赖注入(DI)
    6. 启动内嵌服务器:默认Tomcat
    7. 回调执行:执行 ApplicationRunner/CommandLineRunner,运行容器启动后的个性化需求
  • 容器就绪回调:ApplicationRunner在容器最后阶段执行,早于ApplicationReadyEvent,晚于ContextRefreshedEvent**

/**
* 任务简单且无需容器参数解析场景下,推荐使用CommandLineRunner,代码复杂度低
*/
@Component
public class MyCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// 执行初始化任务System.out.println("CommandLineRunner executed with args: " + Arrays.toString(args));}
}
/**
* ApplicationRunner是对CommandLineRunner的原始参数进行进一步封装,提供更灵活的参数解析能力
*/
@Component
public class MyApplicationRunner implements ApplicationRunner { @Overridepublic void run(ApplicationArguments args) throws Exception {// 获取命令行参数System.out.println("ApplicationRunner executed with args: " + args.getSourceArgs());// 获取选项参数(如--name=value)if (args.containsOption("name")) {System.out.println("Option name value: " + args.getOptionValues("name"));}}
}

依赖管理机制

  • SpringBoot项目会带有一个父项目Spring-boot-starter-parent,它对绝大部分场景启动器做了版本管理
<!--父项目进行版本管理-->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.2</version><relativePath/> <!-- lookup parent from repository -->
</parent>

自动配置机制

场景启动器:场景启动器包含了功能需要的所有依赖

  1. Spring-boot-starter-xxx是Spring官方提供的场景启动器;xxx-Spring-boot-starter是第三方提供的场景启动器
  2. 官方场景启动器会自动管理版本,三方场景启动器需要手动指定版本
  3. Spring会在启动时自动注册场景启动器的相关Bean,属性取默认值,可以后续修改

自动配置流程

  1. 启动 Spring Boot 应用:通过 @SpringBootApplication启动类启动
  2. 扫描自动配置类: 加载所有自动配置类
  3. 条件化匹配:根据当前项目的依赖和配置,决定哪些自动配置类生效
  4. 创建 Bean 并绑定属性:为生效的自动配置类创建 Bean,并绑定 application.yml 中的配置(如果有)
  5. 注入到 Spring 容器:将配置好的 Bean 注册到 IoC 容器中
  • 全局配置文件和配置类

    1. 如果场景启动器相关Bean如果修改属性过程较复杂,建议使用配置类(例如配置rabbitMQ
    2. 非场景启动器相关Bean,SpringBoot不会自动注册,必须使用配置类注册(例如配置redisson
    3. 简单场景或者静态属性可以使用配置文件
@Configuration
public class RedissonConfig {//redisson没有场景启动器,因此需要使用配置类注册Bean@Beanpublic RedissonClient redissonClient(){Config config = new Config();config.setCodec(new StringCodec()).useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456").setDatabase(0);return Redisson.create(config);}
}
@Configuration
public class RabbitMQConfig {//rabbitMQ虽然有场景启动器,但初始化配置过程很复杂,不适合放在全局文件中@Beanpublic ConnectionFactory rabbitConnectionFactory() {CachingConnectionFactory factory = new CachingConnectionFactory();...return factory;}
}

配置类增强功能

  • @ConditionalOnXxx:条件成立时才会通过配置类注册Bean

    1. @ConditionalOnClass:如果项目中存在这个类,则触发行为
    2. @ConditionalOnMissingClass:如果项目中不存在这个类,则触发指定行为
    3. @ConditionalOnBean:如果IOC容器中存在组件,则触发指定行为
    4. @ConditionalOnMissingBean:如果IOC容器中不存在组件,则触发指定行为
    5. @ConditionalOnProperty:如果配置文件中有对应的值才执行
  • @ConfigurationProperties:由统一配置文件信息注入Bean,较于@Value,避免了繁杂的配置文件,可以集中快速管理

    1. 配置类必须有gettersetter
    2. @ConfigurationProperties(prefix = "xxx")选择配置类中的键,支持多层级匹配
    3. 支持松散匹配(databaseUrldatabase-url),但建议使用严格匹配
    4. 非配置类中加载也可以加在属性值,在类上加@EnableConfigurationProperties即可
    5. @ConfigurationProperties也可以注解于方法上,映射返回值实例
  • @Profile:标记类或方法,指定其在特定 Profile 激活时生效

  1. 逻辑或表达式:@Profile({"dev", "test"})@Profile("dev | test")(Spring 6+ 支持)
  2. 逻辑与表达式:@Profile("dev & test")
  3. 否定表达式:@Profile("!prod")
  4. 复杂表达式:@Profile("dev & !cloud")
#application.yaml
db:druid:url: jdbc:mysql://localhost:3306/learn_project?serverTimezone=GMT%2B8username: rootpassword: 123456
@Configuration
@ConfigurationProperties(prefix = "db.druid") 
@Data // 注意!必须有getter、setter
public class DataSourceConfiguration {private String url; // 成员属性值会自动注入private String username;private String password;@Bean@ConditionalOnClass(DruidDataSource.class) //有DruidDataSource时才加载Bean@Profile("!test") // 非test环境下生效public DataSource druidDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}

嵌入式容器

  • SpringBoot引入场景启动器后,会自动内置所需的容器,例如Tomcat
<!-- 热部署 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>
http://www.dtcms.com/a/537003.html

相关文章:

  • 《拆解一封网络信:HTTP 报文详解》
  • wordpress仿站网桌子seo关键词
  • 如何判断服务器是否遭受攻击?
  • DGX A100服务器常见故障解析与维修攻略
  • 各品牌服务器IPMI配置实战经验分享
  • 海口自助建站知乎的网站建设和网站运营
  • 营销策略ppt聊城优化seo
  • 手表网站排行榜个人网站备案申请
  • [无人机sdk] MissionManager | WaypointMission | HotpointMission
  • UGUI源码剖析(16):实战——从零构建一个RadialSlider
  • 做网站要分几部分完成南京做网站公司哪家好
  • 软件测试和DevOps的关系
  • 【vllm】源码解读:DeepSeekV2 DP Rank 专家加载与分配机制
  • YOLOv5 代码深度解析总结
  • 钓鱼网站的制作教程全球网站排行榜
  • 解决 Codex 在 WSL/SSH/VSCODE 登录时报 “Token exchange failed: 403 Forbidden” 问题
  • JS逆向——encrypt-labs实现爆破登录
  • 扬中网站建设流程如何运营好一个网站
  • 公司网站推广计划书wordpress页面新建不了
  • 防爆手机与普通的区别:应用场景、功能、未来发展
  • 阿里云可以做网站wordpress自动加载
  • IGS 转换为 3DXML 全流程:迪威模型网在线实操 + 本地方案指南
  • 【论文精读】VBench:视频生成模型的全方位评估基准套件
  • jsp网站开发模式wap自助建论坛网站
  • WEBSTORM前端 —— 第5章:Web APIs —— 第6节:正则阶段案例
  • 长春 万网 网站建设千年之恋网页设计代码
  • h5游戏免费下载:保护鸡蛋
  • node+pupeteer使用socks5作为代理协议
  • 光亚鸿道全资子公司科东软件通过2025专精特新 “小巨人” 企业认定
  • 北京做养生SPA的网站建设免费自创网站