入门
- 创建项目
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.1</version> </parent>
- 导入场景,选择对应的场景启动器
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
- 主程序
@SpringBootApplication public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class,args); } }
- 业务的编写和之前一样。
- 测试,默认启动localhost:8080。
- 打包,导入插件。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
常用注解
条件注解在注解指定的条件下成立,则触发指定行为。
组件导入
- @Configuration注解编写一个配置类。
- 在配置类中,使用@Bean配合自定义方法给容器注册组件。
- 使用@Import注解导入第三方组件,组件的名字默认是全类名。
属性绑定
@ConfigurationProperties可以将容器内任意组件的属性值和配置文件的配置项的值进行绑定。
@EnableConfigurationProperties配置在配置类中可以将对应的组件放入容器,这样类上就无需使用@Component注解。一般用于导入第三方的包。
自动配置流程
- 导入
starter
,其中包含autoconfigure
包。 autoconfigure
包中文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,里面指定的所有启动要加载的自动配置类。- @EnableAutoConfiguration会自动的把上面文件里面写的所有自动配置类都导入进来,会根据条件注解进行按需加载。
- xxxAutoConfiguration给容器中导入一堆组件,组件都是从xxxProperties配置类中提取属性值。
- xxxProperties配置类又是和配置文件进行了绑定。
yaml细节
- birthDay这类驼峰命令法,在yaml里面推荐写为 birth-day
- 文本:单引号不会转义
\n
,则为普通字符串显示;双引号会转义,\n
会显示为换行符。 - 大文本
|
开头,大文本写在下层,保留文本格式,换行符正确显示>
开头,大文本写在下层,折叠换行符
- 多文档合并,使用
---
可以把多个yaml文档合并在一个文档中,每个文档区依然认为内容独立
日志
Springboot默认使用logback+slf4j
组合作为默认底层日志。
日志是系统一启动就要使用,而xxxAutoConfiguration
是系统启动后的组件,因此日志没有自动配置类,日志是通过监听器机制配置的。
@Slf4j注解会自动注入日志对象,这样就能够直接使用了。
@Slf4j
@RestController
public class HelloController {
@GetMapping("/h")
public String hello(){
log.info("哈哈,方法进来了");
return "hello";
}
}
Springboot默认的日志级别是info等级。
如果自己要自定义配置,配置文件名最好是xx-spring.xml
的形式,加上-spring
后,springboot才能完全控制日志初始化。
最佳实战
- 导入任何第三方框架,先排除它的日志包,因为Springboot底层已经有日志,可能会导致版本冲突。
- 修改
application.properties
配置文件,调整日志的行为。 - 如需对接专业日志系统,也只需要把 logback 记录的日志灌倒 kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可。
- 业务中使用slf4j-api记录日志。
Web开发
Springboot的Web开发能力,是由SpringMVC提供的。
默认使用PathPatternParser进行路径匹配,不能匹配**
在中间的情况,其他与ant风格路径相同。
内容协商
内容协商:一套系统适配多端数据返回,通过accept请求头或请求参数 填写所需协议数据实现。
在Springboot中,基于请求头的内容协商是默认开启的,基于请求参数的内容协商是需要手动开启的。
自定义内容协商机制是使用HttpMessageConverter
提供的configureMessageConverters
底层修改。
使用yaml格式
- 首先导入yaml转换的依赖。
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency>
- 使用工厂方法将对象进行转换成yaml。
ObjectMapper mapper = new objectMapper(new YAMLFactory()); String s = mapper.writevalueAsstring(person);
- 在配置文件中增加一种新的内容类型。
spring.mvc.contentnegotiation.media-types.yaml=text/yaml
- 创建一个新的组件实现效果,并指定媒体类型。
public class MyYamLHttpMessageConverter extends AbstractHttpMessageConverter<object>{ super(new MediaType("text","yaml",charset.forName("UTF-8"))); }
- 在配置类中配置第四步的组件
public void configureMessageConverters(List<HttpMessageconverter<?>>converters){ converters.add(new MyYamlHttpMessageConverter()); }
Thymeleaf
核心语法
指令
标签 | 作用 |
---|---|
th:text | 替换标签体的内容,是纯文本 |
th:utext | 替换标签体的内容,如果是HTML格式会显示对应的格式 |
th:任意HTML属性 | 动态修改任意属性的值 |
th:attr | 任意属性指定,多个属性间使用逗号隔开 |
th:each="元素名,迭代状态:${集合}" | 遍历集合中的元素 |
th:fragment | 定义模板 |
~ | 引用模板 |
th:insert或th:replace | 插入模板 |
表达式
表达式 | 作用 |
---|---|
${} | 变量取值,使用Model对象共享给页面的值 |
@{} | URL路径,会根据项目动态调整 |
#{} | 使用内置工具类 |
~{} | 片段引用 |
*{} | 变量选择,需要配合th:object绑定对象 |
错误处理
错误处理的自动配置都在ErrorMvcAutoConfiguration
中,两大核心机制:
- SpringBoot 会自适应处理错误,响应页面或JSON数据。
- SpringMVC的错误处理机制依然保留,MVC处理不了,才会交给Springboot进行处理,路径为/error。
嵌入式组件
Servlet容器:管理、运行Servlet组件(Servlet、.iter、.Listener)的环境,一般指服务器。
SpringBoot默认嵌入Tomcat作为Servlet容器。自动配置类是ServletWebServerFactoryAutoConfiguration
和EmbeddedWebServerFactoryCustomizerAutoConfiguration
。
全面接管SpringMVC
SpringBoot默认配置好了SpringMVC的所有常用特性。如果我们需要全面接管SpringMVCl的所有配置并禁用默认配置,仅需要编写一个WebMvcConfigurer
配置类,并标注@EnableWebMvc
即可。
任意位置随时通过RequestContextHolder
获取到当前请求和响应的信息。
数据访问
整合SSM
需要在配置类中配置@MapperScan(basePackages = "com.atguigu.ssm.mapper")
指定Mapper所在位置,在配置文件中配置mybatis.mapper-locations=classpath:/mapper/*.xml
指定Mapper对应xml的位置。
找导入的依赖的自动配置类:classpath:/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
下文件配置的所有值,但是要注意条件注解是否导入。或者在配置文件中设置debug=true
开启调试模式,查看导入的类。
步骤
- 导入
mybatis-spring-boot-starter
。 - 配置数据源信息。
- 配置MyBatis的Mapper接口扫描和xml映射文件扫描。
- 编写Bean,Mapper,生成xml,编写Sql语句进行操作。
基础特性
Profiles环境隔离
Spring Profiles提供一种隔离配置的能力,使其仅在特定环境下生效。
使用@Profile
为组件指定环境,默认的环境是default环境。如果组件没有标注该注解,则在任意情况下都生效。
生效的环境=激活的环境/默认环境+包含的环境。
除主配置文件,其他配置文件的命名规范application-xxx.properties
,xxx
为环境名。
项目的所有生效配置项=激活环境配置文件的所有项+主配置文件和激活文件不冲突的所有项。冲突项以激活环境配置文件为准。
只需在jar应用所在文件夹放一个application.properties
最新配置文件,会覆盖原有的配置文件,重启项目就能自动应用最新配置。
建议使用同一种格式的配置文件,如果.properties
和.yaml
同时存在,则.properties
优先。
配置文件优先度:外面>内部。
步骤
- 标识环境:指定哪些组件、配置在什么环境下生效。
- 切换环境:默认只有激活指定环境,这些组件才会生效。在配置文件中使用
spring.profiles.active
属性指定。
核心原理
生命周期
- 引导:利用BootstrapContext引导整个项目启动。
- 启动:配置ioc容器。
- 运行: