SpringBoot3

发布时间 2023-12-13 11:15:06作者: 西芹-小汤圆

入门

  1. 创建项目
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.1</version>
    </parent>
    
  2. 导入场景,选择对应的场景启动器
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
  3. 主程序
    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            SpringApplication.run(MainApplication.class,args);
        }
    }
    
  4. 业务的编写和之前一样。
  5. 测试,默认启动localhost:8080。
  6. 打包,导入插件。
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    

常用注解

条件注解在注解指定的条件下成立,则触发指定行为。

组件导入

  1. @Configuration注解编写一个配置类。
  2. 在配置类中,使用@Bean配合自定义方法给容器注册组件。
  3. 使用@Import注解导入第三方组件,组件的名字默认是全类名。

属性绑定

@ConfigurationProperties可以将容器内任意组件的属性值和配置文件的配置项的值进行绑定。

@EnableConfigurationProperties配置在配置类中可以将对应的组件放入容器,这样类上就无需使用@Component注解。一般用于导入第三方的包。

自动配置流程

  1. 导入starter,其中包含autoconfigure包。
  2. autoconfigure包中文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类。
  3. @EnableAutoConfiguration会自动的把上面文件里面写的所有自动配置类都导入进来,会根据条件注解进行按需加载。
  4. xxxAutoConfiguration给容器中导入一堆组件,组件都是从xxxProperties配置类中提取属性值。
  5. 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才能完全控制日志初始化。

最佳实战

  1. 导入任何第三方框架,先排除它的日志包,因为Springboot底层已经有日志,可能会导致版本冲突。
  2. 修改application.properties配置文件,调整日志的行为。
  3. 如需对接专业日志系统,也只需要把 logback 记录的日志灌倒 kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可。
  4. 业务中使用slf4j-api记录日志。

Web开发

Springboot的Web开发能力,是由SpringMVC提供的。

默认使用PathPatternParser进行路径匹配,不能匹配**在中间的情况,其他与ant风格路径相同。

内容协商

内容协商:一套系统适配多端数据返回,通过accept请求头或请求参数 填写所需协议数据实现。

在Springboot中,基于请求头的内容协商是默认开启的,基于请求参数的内容协商是需要手动开启的。

自定义内容协商机制是使用HttpMessageConverter提供的configureMessageConverters底层修改。

使用yaml格式

  1. 首先导入yaml转换的依赖。
    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-yaml</artifactId>
    </dependency>
    
  2. 使用工厂方法将对象进行转换成yaml。
    ObjectMapper mapper = new objectMapper(new YAMLFactory());
    String s = mapper.writevalueAsstring(person);
    
  3. 在配置文件中增加一种新的内容类型。
    spring.mvc.contentnegotiation.media-types.yaml=text/yaml
    
  4. 创建一个新的组件实现效果,并指定媒体类型。
    public class MyYamLHttpMessageConverter extends AbstractHttpMessageConverter<object>{
      super(new MediaType("text","yaml",charset.forName("UTF-8")));
    }
    
  5. 在配置类中配置第四步的组件
     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中,两大核心机制:

  1. SpringBoot 会自适应处理错误,响应页面或JSON数据。
  2. SpringMVC的错误处理机制依然保留,MVC处理不了,才会交给Springboot进行处理,路径为/error。

嵌入式组件

Servlet容器:管理、运行Servlet组件(Servlet、.iter、.Listener)的环境,一般指服务器。

SpringBoot默认嵌入Tomcat作为Servlet容器。自动配置类是ServletWebServerFactoryAutoConfigurationEmbeddedWebServerFactoryCustomizerAutoConfiguration

全面接管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开启调试模式,查看导入的类。

步骤

  1. 导入mybatis-spring-boot-starter
  2. 配置数据源信息。
  3. 配置MyBatis的Mapper接口扫描和xml映射文件扫描。
  4. 编写Bean,Mapper,生成xml,编写Sql语句进行操作。

基础特性

Profiles环境隔离

Spring Profiles提供一种隔离配置的能力,使其仅在特定环境下生效。

使用@Profile为组件指定环境,默认的环境是default环境。如果组件没有标注该注解,则在任意情况下都生效。

生效的环境=激活的环境/默认环境+包含的环境。

除主配置文件,其他配置文件的命名规范application-xxx.propertiesxxx为环境名。

项目的所有生效配置项=激活环境配置文件的所有项+主配置文件和激活文件不冲突的所有项。冲突项以激活环境配置文件为准。

只需在jar应用所在文件夹放一个application.properties最新配置文件,会覆盖原有的配置文件,重启项目就能自动应用最新配置。

建议使用同一种格式的配置文件,如果.properties.yaml同时存在,则.properties优先。

配置文件优先度:外面>内部。

步骤

  1. 标识环境:指定哪些组件、配置在什么环境下生效。
  2. 切换环境:默认只有激活指定环境,这些组件才会生效。在配置文件中使用spring.profiles.active属性指定。

核心原理

生命周期

  1. 引导:利用BootstrapContext引导整个项目启动。
  2. 启动:配置ioc容器。
  3. 运行: