SpringBoot
视频链接:
【黑马程序员SpringBoot3+Vue3全套视频教程,springboot+vue企业级全栈开发从基础、实战到面试一套通关】https://www.bilibili.com/video/BV14z4y1N7pg?p=20&vd_source=12bdb5b78bd5d1c45cab173f3aad839b
概述
Spring Boot 是 Spring 提供的一个子项目,用于快速构建 Spring 应用程序
-
Spring Framework(核心功能):
- 提供依赖注入、事务管理、Web应用、数据访问等核心支持。
-
Spring Data(数据存取):
- 提供一致的方法来访问数据,包括关系型、非关系型、映射化数据等。
-
Spring Security(认证授权):
- 通过全面且可扩展的认证和授权功能来保护应用程序。
-
Spring AMQP(消息传递集成):
- 应用于基于AMQP协议的消息传递解决方案的开发。
-
Spring Cloud(服务构建):
- 提供用于分布式系统中常见模式的工具,适用于构建和管理微服务
-
Spring Boot(项目构建):
- 提供了一种有见解的方式来构建Spring应用程序,使其尽可能简单。
特性
-
起步依赖
本质上就是一个 Maven 坐标,整合了完成一个功能需要的所有坐标
-
自动配置
遵循约定大于配置的原则,当启动应用程序时,一些bean对象会自动注入到IoC容器中,无需手动声明,从而简化了开发
-
其他特性
-
内嵌的 Tomcat 、 Jetty (无需部署 WAR 文件)
-
外部化配置
-
不需要 XML 配置 (properties/yml)
-
配置文件格式
-
application.properties
:这是一个经典的Spring Boot配置文件,使用简单的key=value格式来定义属性。例如:
server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456
-
application.yml
(推荐):这是另一种常见的配置文件格式,使用YAML语法来组织属性。它支持更复杂的数据结构和多行值。,它更加简洁,层次分明,支持列表和复杂对象。例如:
server: port: 8080 logging: level: org.springframework: INFO
配置文件优先级:application.properties> application.yml
YAML 配置书写规则
- 缩进表示层级关系:使用空格进行缩进,不能使用Tab键。
- 大小写敏感:键值对中的键是大小写敏感的。
- 使用缩进表示列表:列表成员使用"-"加一个空格开始。
- 键值对:使用冒号加一个空格(
key: value
)区分键和值。 - 数据类型:支持字符串、整数、浮点数、布尔值、日期、时间、列表和字典等
# 这是一个YAML的注释
name: Zhang San # 字符串
age: 30 # 整数
married: true # 布尔值
children: # 列表
- name: Li Si
age: 5
- name: Wang Wu
age: 7
address: # 字典
city: Beijing
street: Wangfujing
YAML 配置获取方式
假设 application.yml
中有以下配置:
myapp:
name: MyApp
version: 1.0.0
1. 使用 @Value("${键名}")
@Value
注解允许直接将属性值注入到Spring组件中,通过指定键名来获取对应的配置值。它适合用于获取单个属性值或者少量的属性值。
示例用法:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class MyComponent {
@Value("${myapp.name}")
private String appName;
@Value("${myapp.version}")
private String appVersion;
public void displayAppInfo() {
System.out.println("Application Name: " + appName);
System.out.println("Application Version: " + appVersion);
}
}
在上面的例子中,@Value("${myapp.name}")
和 @Value("${myapp.version}")
分别获取了 application.yml
中 myapp.name
和 myapp.version
的属性值。
2. 使用 @ConfigurationProperties(prefix="前缀")
@ConfigurationProperties
注解则更适合用于将一组相关的配置属性绑定到一个Java Bean上。它通常用于组织和管理多个配置属性,特别是在配置较复杂的场景下更有用。
示例用法:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String name;
private String version;
// Getters and setters
public void displayAppInfo() {
System.out.println("Application Name: " + name);
System.out.println("Application Version: " + version);
}
}
- @Value 适合获取少量的配置值或者动态变化的属性。
- @ConfigurationProperties 更适合管理和组织大量的配置属性,并且可以通过将它们绑定到一个专门的Java Bean 上来实现类型安全的配置属性访问。
Mybatis整合
SpringBoot整合Mybatis,参见链接后端代码实现部分
Bean管理
Bean扫描
1.XML配置方式
<context:component-scan base-package="com.itheima"/>
<context:component-scan>
标签用于指定Spring需要扫描的基础包路径(base-package)。在这个例子中,Spring将扫描com.itheima
包及其子包,寻找带有特定注解的类,并将它们注册为Spring的Bean。
2.注解配置方式
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.itheima")
public class AppConfig {
// 配置类,可以在这里添加其他配置
}
@ComponentScan(basePackages = "com.itheima")
注解放在配置类(通常是带有@Configuration
注解的类)上,告诉Spring在com.itheima
包及其子包中寻找带有特定注解的类,并注册它们为Spring的Bean。
@SpringBootApplication注解
SpringBoot 默认扫描启动类所在的包及其子包
@SpringBootApplication
是 Spring Boot 提供的一个组合注解,它包含了以下三个注解的功能:
@SpringBootConfiguration
:表明该类是一个配置类,它可以替代 XML 配置文件。它实际上是@Configuration
注解的一个特殊类型。@ComponentScan
:用于启用组件扫描,寻找带有@Component
注解的类。如果没有显式地指定basePackages
参数,它将会扫描当前类所在的包及其子包。@EnableAutoConfiguration
:开启自动配置功能,Spring Boot 将根据项目的依赖性和配置自动配置应用程序。
Bean注册
如果要注册的 bean 对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明 bean 的,通常可以通过以下方式来实现:
1. 使用 @Import
- **** 在配置类中,你可以使用
@Bean
注解来显式地定义一个方法,该方法创建并返回第三方类的实例。如果第三方库提供了专门的配置类,你可以直接导入该配置类来注册 Bean。
@Configuration
public class AppConfig {
@Bean
public ThirdPartyService thirdPartyService() {
return new ThirdPartyService();
}
}
- 通过
@Import
注解,你可以导入一个或多个配置类,这些配置类中可以包含@Bean
注解方法,用于注册第三方 Bean。
@SpringBootApplication
@Import(AppConfig.class)//多个配置类导入:@Import(AppConfig1.class,AppConfig2.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.实现 ImportSelector
接口
如果需要根据条件或其他因素动态地选择性地导入某些配置类或 Bean,可以实现 ImportSelector
接口。这允许你根据运行时的条件来决定哪些配置类应该被导入。
java解释import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// Return an array of class names to import
return new String[] {ThirdPartyConfig.class.getName()};
}
}
然后在主配置类中使用 @Import
导入 MyImportSelector
实现类:
java解释import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@SpringBootApplication
@Import({MyImportSelector.class})
public class SpringbootRegistApplication {
// Application class body
}
注册条件
1.@ConditionalOnProperty
- 说明:当配置文件中存在指定的属性时,才会声明该 Bean。
- 示例:假设你希望某个 Bean 在配置文件中设置了特定属性
myapp.feature.enabled=true
时才被注册,
@Component
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyFeatureBean {
// Bean definition
}
@ConditionalOnProperty
注解有两个主要的属性:
name
:指定要检查的配置属性名。havingValue
:指定配置属性应该具有的值。如果属性的值与havingValue
指定的值匹配,那么条件成立,Bean 将会被创建。
2.@ConditionalOnMissingBean
-
说明:当当前上下文中不存在指定类型的 Bean 时,才会声明该 Bean。
-
示例
:假设你希望确保在上下文中只有没有特定类型的 Bean 时才注册某个 Bean
@Component @ConditionalOnMissingBean(MyService.class) public class MyFallbackService implements MyService { }
3.@ConditionalOnClass
-
说明:当当前环境中存在指定的类时,才会声明该 Bean。
-
示例:假设你的应用程序在运行时需要依赖于某个第三方库的类才能正常工作,
ThirdPartyIntegration
Bean 只有在类路径中存在com.example.ThirdPartyClass
类时才会被注册。@Component @ConditionalOnClass(name = "com.example.ThirdPartyClass") public class ThirdPartyIntegration { // Bean definition }
自动配置
遵循约定大约配置的原则,在 boot 程序启动后,起步依赖中的一些 bean 对象会自动注入到 ioc 容器。程序引入 spring-boot-starter-web 起步依赖,启动后,会自动往 ioc 容器中注入 DispatcherServlet
SpringBoot 自动配置原理
自定义 starter
- 自定义 starter 需求:自定义 mybatis 的 starter 需求
- 创建 dmybatis-spring-boot-autoconfigure 模块,提供自动配置功能,并自定义配置文件 META-INF/spring/xxx.imports
- 创建 dmybatis-spring-boot-starter 模块,在 starter 中引入自动配置模块