• 框架之SpringBoot基础(一)


    一、Spring优缺点分析

    Spring优点:

    • Spring是一个轻量级的Java开源框架,通过IoC和AOP轻松实现程序开发

    Spring缺点:

    • 虽然Spring的组件代码是轻量级的,但它在开发时整合的配置却是重量级的,比如:
      – 添加一个框架或技术时,需要添加相应的maven坐标
      – 添加一个框架或技术时,引入的坐标 可能出现依赖冲突
      – 添加一个框架或技术时,需要添加大量的配置

    二、SpringBoot概述

    SpringBoot对Spring的缺点进行了改善和优化,基于约定优于配置的思想,提供了大量的默认配置和实现。

    版本锁定:

    • 解决maven依赖版本容易冲突的问题,集合了常用且测试过的所有版本

    起步依赖:

    • 集合了常用jar包

    自动配置:

    • 集合了所有约定的默认配置,解决整合框架或者技术栈配置文件过多的问题

    内置Tomcat:

    • 通过内置的Tomcat,可以直接运行JaveEE程序

    SpringBoot最主要的作用是帮助程序员快速构建Spring项目,让程序员更多的关注业务而非配置

    三、SpringBoot初体验

    3.1 搭建SpringBoot环境

    导入依赖:

    
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.2.2.RELEASEversion>
    parent>
    
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
     dependencces>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    启动类:

    @SpringBootApplication// 告诉springboot这是一个启动类
    public class QuickApplication {
    
        // 通过main方法运行启动类
        public static void main(String[] args) {
            SpringApplication.run(QuickApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动并测试
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    3.2 SpringBoot初步解析

    版本锁定:

    • spring-boot-starter-parent父工程内部有一系列已经指定好的版本号,组合了一套最优搭配的技术版本
      在这里插入图片描述
      起步依赖:
      在这里插入图片描述
      起步依赖一部分由SpringBoot官方提供,一部分由第三方开发(如mybatis框架)

    自动装配:
    SpringBoot基于约定优于配置的思想,许多配置都有默认值,如tomcat默认端口 8080、redis 默认端口6379 等等
    在这里插入图片描述

    3.3 SpringBoot配置文件

    如果想使用自定义的配置替换默认配置,可以在resources创建以下文件:

    • application.yml
    • applicationyaml
    • appliccationproperties

    注意:如果多个配置文件同时配置了相同的内容,SpringBoot在2.4版本之前以properties文件为准

    3.3.1 yaml简介

    yaml是专门用来写配置文件的语言,非常简洁,比xml格式方便

    propertiesxmlyaml \ yml
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    yaml语法:

    • 大小写敏感,使用缩进表示层级关系
    • 缩进的空格数目不重要,但是相同层级的元素必须左侧对齐
    • 参数值和冒号之间必须有空格
    server:
    	port: 8082
    	address: 127.0.0.1
    
    # 简单格式(坑 key命名不能使用username)
    age: 18
    
    # 对象格式
    user:
    	username: jack
    	age: ${age}
    	gender: male
    
    # 集合格式
    addressList:
    	- '北京'
    	- '上海'
    	- '广州'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.3.2 读取配置文件

    @Value
    该注解是Spring框架提供的,用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中
    在这里插入图片描述

    Environment
    该对象由Spring框架提供,用来表示整个应用运行时的环境,可以读取配置文件中的属性值并逐个注入到Bean对象的对象的对应属性中
    在这里插入图片描述

    @ConfigurationProperties
    该注解由SpringBoot框架提供,用来快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中
    在这里插入图片描述
    解决一个红色提示的小bug

    在这里插入图片描述

    3.4 SpringBoot启动流程

    在这里插入图片描述

    四、SpringBoot整合其他框架

    4.1 整合SpringMVC

    SpringBoot启动时会加载org.springframework.boot.autoconfigure.web.ResourceProperties资源属性类,静态资源放在Resources下static文件夹中
    在这里插入图片描述
    在这里插入图片描述
    拦截器配置

    • 自定义一个springMVC拦截器类,实现HandlerInterceptor接口
    @Component
    public class MyHandlerInterceptor implements HandlerInterceptor {
    
        // 预处理拦截
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle拦截了");
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 自定义SpringMVC配置类,实现WebMvcConfigurer接口
    @Configuration // 配置类
    public class MyMVCConfiguration implements WebMvcConfigurer {
    
        @Autowired
        private MyHandlerInterceptor myHandlerInterceptor;
    
        // 注册拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(myHandlerInterceptor)
                    .addPathPatterns("/img/**") // 拦截路径
                    .excludePathPatterns("/img/1syn.jpg"); // 放行路径
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.2 整合Mybatis

    • 添加依赖
    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>5.1.6version>
    dependency>
    
    <dependency>
        <groupId>org.mybatis.spring.bootgroupId>
        <artifactId>mybatis-spring-boot-starterartifactId>
        <version>2.1.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 准备数据库
      在这里插入图片描述
    • User实体
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
    
        private Long id;
        private String username;
        private String password;
        private String nickName;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • UserMapper接口和映射
      在这里插入图片描述
    public interface UserMapper {
    
        List<User> findAll();
    }
    
    • 1
    • 2
    • 3
    • 4
    
    DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.mapper.UserMapper">
    
        <select id="findAll" resultType="User">
            SELECT * FROM tb_user
        select>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • application.yml配置
    # 连接池指定数据库连接四项
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot_db
        username: root
        password: root
    
    
    # mybatis配置
    mybatis:
      mapper-locations: classpath:mapper/*.xml  # 指定映射文件目录
      type-aliases-package: com.itheima.domain # 指定实体别名
      configuration:  # nickName  自动映射 nick_name
        map-underscore-to-camel-case: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 将mapper代理对象放到ioc容器
      – 方式一
    @Mapper
    public interface UserMapper {
    	List<User> findAll();
    }
    
    • 1
    • 2
    • 3
    • 4

    – 方式二

    @SpringBootApplication
    @MapperScan("com.baidu.mapper") // 将mapper包下接口交给ioc容器并创建代理对象
    public class QuickApplication {
    	
    	// 通过main方法运行启动类
    	public static void main(String[] args){
    		SpringApplication.class,args)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 单元测试
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MyBatisTest {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void test01() throws Exception {
            List<User> list = userMapper.findAll();
            for (User user : list) {
                System.out.println(user);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • Druid连接池
      springboot 2.2.0版本之后,内置了HiKariCP连接池,那如何替换成阿里的Druid连接池呢?
    
    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druidartifactId>
        <version>1.1.15version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改application.yml
    – 添加spring.datasource.type配置项

    # 连接池指定数据库连接四项
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot_db
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.3 整合日志框架

    • 日志介绍
      在项目的开发中,日志是必不可少的一个记录事件的组件,不管是记录运行情况还是追踪线上问题,都离不开对日志的分析,所以也会相应的在项目中实现和构建我们所需要的日志框架。而市面上常见的日志框架有很多,比如:JCL、SLF4J、jUL、log4j、log4j2、logback等等

      通常情况下,日志是由一个抽象(接口)层+实现层的组合来搭建的

    日志-接口层日志-实现层
    日志-接口层日志-实现层JCL(Jakarta Commons Logging)、SLF4J(Simple Logging Facade for Java)jul(java.util.logging)、 log4j、logback、log4j2

    SpringBoot在2.0版本后默认选择了 SLF4J 结合 LogBack

    • SLF4J介绍
      在开发的时候不应该直接使用日志实现类,应该使用日志的接口层
      下图是 SLF4J 结合各种日志框架的官方示例,从图中可以清晰的看出 SLF4J API 永远作为日志的门面(规范),直接应用与应用程序中
      在这里插入图片描述

    • SLF4J使用
      SpringBoot 是使用了 SLF4J+logback 的日志框架组合

      查看 Spring Boot 项目的 Maven 依赖关系可以看到 Spring Boot 的核心启动器spring-boot-starter 引入了 spring-boot-starter-logging

    /*
     * 测试日志输出,
     * SLF4J 常见的日志级别从小到大  debug,info,warn,error
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class LogbackTest {
    
        Logger logger = LoggerFactory.getLogger(LogbackTest.class);
    
        @Test
        public void testLog() {
            logger.debug("Debug 日志...");
            logger.info("Info 日志...");
            logger.warn("Warn 日志...");
            logger.error("Error 日志...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    SpringBoot 默认日志级别为 INFO

    • 自定义日志输出
    # 日志配置
    logging:
      level: # 指定项目日志级别
        com.baidu: debug
      file: # 指定日志输出路径文件
        name: D:\springboot-quick.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • @Slf4j注解
      如果不想每次都写private final Logger logger = LoggerFactory.getLogger(当前类名.class);

      可以在类上面添加@Sl4j注解,然后使用log对象打印日志

      要求:idea首先需要安装Lombok插件

    五、SpringBoot热更新

    在开发过程中,通常会对一段业务代码不断地修改测试,在修改之后往往需要重启服务,有些服务需要加载很久才能启动成功,这种不必要的重复操作极大的降低了程序开发效率。为此,Spring Boot框架专门提供了进行热部署的依赖启动器,用于进行项目热部署,而无需手动重启项目

    • 引入热部署起步依赖
    <dependency>
       <groupId>org.springframework.bootgroupId>
       <artifactId>spring-boot-devtoolsartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 选择IDEA工具界面的【File】->【Settings】选项,打开Compiler面板设置页面
      在这里插入图片描述
    • 在项目任意页面中使用组合快捷键“Ctrl+Shift+Alt+/”打开Maintenance选项框,选中并打开Registry
      在这里插入图片描述
    • 找到“compiler.automake.allow.when.app.running”,将该选项后的Value值勾选
      在这里插入图片描述
      如果修改自己代码没有立即生效,需要按ctrl+F9
  • 相关阅读:
    Android茶叶进销存
    Wireshark Lua插件入门
    《Python趣味工具》——自制emoji2(2)
    百趣代谢组学资讯:项目文章Nature,揭示低温暴露抑制实体瘤生长机制,‘饿死’癌细胞
    MYSQL用函数请三思
    技术书籍超级阅读法
    【项目开发 | C语言项目 | C语言病人管理系统】
    一面数据: Hadoop 迁移云上架构设计与实践
    Python零基础入门-11 标准库简介 —— 第二部分
    挺后悔,我敷衍地回答了“程序员如何提升抽象思维“
  • 原文地址:https://blog.csdn.net/tysearch/article/details/125700524