Java框架--SpringBoot
Java框架--SpringBoot
基本介绍
-
官方文档
官网: https://spring.io/projects/spring-boot
学习文档: https://docs.spring.io/spring-boot/docs/current/reference/html/
离线文档: spring-boot-reference.pdf
在线 API: https://docs.spring.io/spring-boot/docs/current/api/
-
Spring Boot是什么?
第一句话: Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序
第二句话: Spring Boot 直接嵌入 Tomcat、Jetty 或 Undertow ,可以"直接运行" Spring Boot 应用程序
-
快速入门(代码仓库源代码实现)小结
SpringBoot 比较传统的 SSM 开发, 简化整合步骤, 提高开发效率
简化了 Maven 项目的 pom.xml 依赖导入, 可以说是一键导入
引入一个spring-boot-starter-web,到底发生了什么(导入了web开发常用jar文件包)
内置Tomcat ,简化服务器的配置(Tomcat服务映射为成为一个类进行服务启动和管理)
-
Spring SpringMVC SpringBoot 的关系
-
关系梳理
- Spring Boot > Spring > Spring MVC (>是包含之意)
- Spring MVC只是Spring处理WEB层请求的一个模块/组件, Spring MVC的基石是Servlet
- Spring 的核心是 IOC 和 AOP, IOC 提供了依赖注入的容器 , AOP 解决了面向切面编程
- Spring Boot 是为了简化开发, 推出的封神框架(约定优于配置[COC],简化了 Spring 项目的配置流程), SpringBoot 包含很多组件/框架,Spring就是最核心的内容之一,也包含 Spring MVC
- Spring 家族,有众多衍生框架和组件例如 boot、security、jpa 等, 他们的基础都是 Spring
-
如何理解 -约定优于配置
- 约定优于配置(Convention over Configuration/COC),又称按约定编程,是一种软件设计规范, 本质上是对系统、类库或框架中一些东西假定一个大众化合理的默认值(缺省值)
- 例如在模型中存在一个名为 User 的类,那么对应到数据库会存在一个名为 user 的表, 只有在偏离这个约定时才需要做相关的配置 (例如你想将表名命名为 t_user 等非 user 时才需要写关于这个名字的配置)
- 简单来说就是假如你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时, 才需要对约定进行替换配置
- 约定优于配置理念【解读:为什么要搞一个约定优于配置】约定其实就是一种规范,遵循了规范,那么就存在通用性,存在通用性,那么事情就会变 得相对简单,程序员之间的沟通成本会降低,工作效率会提升,合作也会变得更加简单,生活中,这样的情况,大量存在
-
依赖管理和自动配置
依赖管理
- 什么是依赖管理
- spring-boot-starter-parent 还有父项目, 声明了开发中常用的依赖的版本号
<!--父工程引入,为了规定统一版本,如果需要正式依赖,还是需要dependencies引入--> <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.5.3</version> </parent>
- 自动版本仲裁:即如果程序员没有指定某个依赖 jar 的版本,则以父项目指定的版本为准
- 修改自动仲裁/默认版本号
- 使用<properties><mysql.version>5.1.49</mysql.version></properties>
- 或者显示声明dependency依赖,根据依赖就近优先原则,以自己指定的为准
场景启动器
-
介绍
-
开发中我们引入了相关场景的 starter,这个场景中所有的相关依赖都引入进来了,比如我们做 web 开发引入了,该 starter 将导入与 web 开发相关的所有包
-
依赖树 : 可以看到 spring-boot-starter-web ,帮我们引入了 spring-webmvc,spring-web 开发模块,还引入了 spring-boot-starter-tomcat 场景,spring-boot-starter-json 场景,这些 场景下面又引入了一大堆相关的包,这些依赖项可以快速启动和运行一个项目,提高开发 效率
-
所有场景启动器最基本的依赖就是 spring-boot-starter , 前面的依赖树分析可以看到,这个依赖也就是 SpringBoot 自动配置的核心依赖
-
-
官方提供starter
- 地址:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
- 在开发中我们经常会用到 spring-boot-starter-xxx ,比如 spring-boot-starter-web,该场 景是用作 web 开发,也就是说 xxx 是某种开发场景
- 我们只要引入 starter,这个场景的所有常规需要的依赖我们都自动引入。
- SpringBoot2支持的所有场景 : https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
<!--引入启动环境SB--> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!--因自己要创建tomcat对象并启动,所以排除内嵌的tomcat对象--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
-
第三方 starter
- SpringBoot 也支持第三方 starter
- 第三方 starter 不要从 spring-boot 开始,因为这是官方 spring-boot 保留的命名方式的。 第三方启动程序通常以项目名称开头。例如,名为 thirdpartyproject 的第三方启动程序项 目通常被命名为 thirdpartyproject-spring-boot-starter。
- 也就是说:xxx-spring-boot-starter 是第三方为我们提供的简化开发的场景启动器
-
自动配置
-
学习 SSM 整合时,需要配置 Tomcat 、配置 SpringMVC、配置如何扫描包、配置字符过滤器、配置视图解析器、文件上传等,而在
SpringBoot 中,存在自动配置机制,提高开发效率
-
-
SpringBoot 自动配置了哪些?
- 自动配置 Tomcat
- 自动配置 SpringMVC
- 自动配置 Web 常用功能: 比如字符过滤器
- 自 动 配 置 : 默 认 扫 描 包 结 构(官 方 文 档 : https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.structuring-your-code.using-the-default-package)
-
如何修改SpringBoot默认配置?
- 修改增加扫描包:@SpringBootApplication(scanBasePackages = "com.szl")
- resources\application.properties配置大全,SpringBoot 项目最重要也是最核心的配置文件就是 application.properties,所有的框架配置都可以在这个配置文件中说明(https://blog.csdn.net/pbrlovejava/article/details/82659702)
容器功能
Spring 注入组件的注解
-
@Component、@Controller、 @Service、@Repository
- 这些在 Spring 中的传统注解仍然有效,通过这些注解可以给容器注入组件
-
@Configuration
-
通过@Configuration 创建配置类来注入组件
//@Configuration 标识这是一个配置类: 等价 配置文件 @Configuration public class BeanConfig { / 1. @Bean : 给容器中添加组件 * 2. monster01() : 默认方法名作为组件的 id * 3. Monster: 返回类型就是组件类型, 返回的值就是 new Monster(100, "牛魔王", 500, "芭蕉扇") * 4. @Bean("monster_nmw"): 重新指定组件的 id = “monster_nmw” * 5. 配置类里面使用@Bean 标注在方法上给容器注册组件,默认是单实例的 */ // @Bean("monster_nmw") @Bean public Monster monster01() { return new Monster(100, "牛魔王", 500, "芭蕉扇"); } }
-
配置类本身也是组件, 因此也可以获取
-
SpringBoot2新增特性:proxyBeanMethods指定Full模式和Lite模式
代理 bean 的方法
(1) Full(proxyBeanMethods = true)、【保证每个@Bean 方法被调用多少次返回的组件都是 单实例的, 是代理方式】
(2) Lite(proxyBeanMethods = false)【每个@Bean 方法被调用多少次返回的组件都是新创 建的, 是非代理方式】
(3) 特别说明: proxyBeanMethods 是在 调用@Bean 方法 才生效,因此,需要先获取 BeanConfig 组件,再调用方法而不是直接通过 SpringBoot 主程序得到的容器来获取 bean, 注意观察直接通过 ioc.getBean() 获取 Bean, proxyBeanMethods 值并没有生效
(4) 如何选择: 组件依赖必须使用 Full 模式默认。如果不需要组件依赖使用 Lite 模
(5) Lite 模 也称为轻量级模式,因为不检测依赖关系,运行速度快 -
配置类可以有多个, 就和 Spring 可以有多个 ioc 配置文件是一个道理
-
-
@Import
-
通过 @Import 来注入组件
/** Import 可以传入一个数组,可以一次注入多个组件 * public @interface Import { * Class<?>[] value(); * } * 注意@Import 方式注入的组件, 默认组件的名字就是全类名 */ @Import({Dog.class, Cat.class}) @Configuration(proxyBeanMethods = false) public class BeanConfig {}
-
-
@Conditional
- 条件装配:满足 Conditional 指定的条件,则进行组件注入
- @Conditional 是一个根注解,下面有很多扩展注解
-
@ImportResource
- 原生配置文件引入, 也就是可以直接导入 Spring 传统的 beans.xml ,可以认 为是 SpringBoot 对 Spring 容器文件的兼容
-
配置绑定
-
使用 Java 读取到 SpringBoot 核心配置文件 application.properties 的内容,并且把它封装到 JavaBean 中
-
@ConfigurationProperties(prefix = "xxxx") 需要配合@Component注入标识一起使用,或者配合配置类(带有配置类标识的类)上增加@EnableConfigurationProperties(指向的类.class)来使用
-
注意1:配置文件 application.properties 的内容如:furn01.id=100,id要对应bean中的属性名称,否则赋值失败为空
-
注意2:如果 application.properties 有中文, 需要转成 unicode 编码写入, 否则出现乱码
-
注意3:使用 @ConfigurationProperties(prefix = "furn01") 会提示not configured,不影响使用,若想去除可以在项目pos文件中增加以下代码
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?