SpringBoot初级--概述、快速入门、配置、整合其他框架

SpringBoot初级

文章整理参考自:黑马程序员SpringBoot教程

SpringBoot概述

SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。 2014 年 4 月,Spring Boot 1.0.0 发布。Spring的顶级项目之一(https://spring.io)。

Spring缺点:
  1. 配置繁琐

    虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但它要求的回报也不少。

  2. 依赖繁琐

    项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

SpringBoot功能:
  1. 自动配置

    Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。

  2. 起步依赖

    起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

  3. 辅助功能

    提供了一些大型项目中常见的非功能性特性,如嵌入式服务器(启动时不需要配置服务器,内置了tomcat服务器)、安全、指标,健康检测、外部配置等。

    Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式


SpringBoot快速入门

  1. 需求

    搭建SpringBoot工程,定义HelloController.hello()方法,返回”Hello SpringBoot!”。

  2. 实现步骤

    2.1 创建Maven项目
    在这里插入图片描述在这里插入图片描述

    2.2 导入SpringBoot起步依赖

    pom.xml文件导入如下依赖

    <!--SpringBoot工程需要继承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
    </parent>
    
    <dependencies>
        <!--web开发的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    

    2.3 定义Controller

    package com.zhi.controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {    
        @RequestMapping("/hello")    
        public String hello(){        
            return "hello Spring Boot !";    
        }
    }
    

    2.4 编写引导类

    注意引导类在项目下,而不是controller包内。

    package com.zhi;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /** 
    * 引导类(启动类)。springboot项目的入口
    */
    @SpringBootApplication
    public class HelloApplication {    
     public static void main(String[] args) {       	 			      SpringApplication.run(HelloApplication.class, args);    
       }
    }
    

    2.5 启动测试

    直接点击运行或右键选择“Run”运行

    在这里插入图片描述
    在这里插入图片描述

    使用IDEA快速构建springBoot工程

    1. 创建Spring Initializr项目
      在这里插入图片描述

    2. 勾选web依赖
      在这里插入图片描述

    3. 定义controller

      package com.xiaozhi.springbootinit.controller;
      
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      @RestController
      public class HelloController {
          @RequestMapping("/hello")
          public String hello(){
              return "Hello Spring Boot init!";
          }
      
      }
      
    4. 启动引导类main方法
      在这里插入图片描述浏览器访问
      在这里插入图片描述

    小结:

    • SpringBoot在创建项目时,使用jar的打包方式。
    • SpringBoot的引导类,是项目入口,运行main方法就可以启动项目。
    • 使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样。
SpringBoot起步依赖原理分析

版本锁定(按住“ctrl” +点击 spring-boot-starter-parent 跳转)
在这里插入图片描述
依赖传递(按住‘“ctrl” + 点击spring-boot-starter-web 跳转)
在这里插入图片描述

  • 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本。
  • 在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。
  • 我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题。

SpringBoot配置

配置文件分类

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties或者application.yml(application.yaml)进行配置。

properties:(键值对)

server.port=8081

在这里插入图片描述

yaml:(缩进,值前面必须有空格)

server:
  port: 8082

在这里插入图片描述

  • SpringBoot提供了两种配置文件类型:propertiesyml/yaml
  • 默认配置文件名称:application
  • 在同一级目录下优先级为:properties > yml > yaml
yaml

yaml:YAML全称是 YAML Ain’t Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。 YAML文件的扩展名可以使用.yml或者.yaml。

properties:

server.port=8080
server.address=127.0.0.1

xml:

<server>
    <port>8080</port>
    <address>127.0.0.1</address>
</server>

yaml:

server: 
	port: 8080
	address: 127.0.0.1

yaml基本语法

  • 大小写敏感
  • 数据值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • **#**表示注释,从这个字符一直到行尾,都会被解析器忽略。

yaml数据格式

  • 对象(map):键值对的集合
person:
name: zhangsan
#行内写法
person: {name: zhangsan}
  • 数组:一组按次序排列的值
address:
- beijing
- shanghai
#行内写法
address: [beijing,shanghai]
  • 纯量: 单个的,不可再分的值
msg1: 'hello \n world' #单引忽略转义字符
msg2: "hello \n world" #双引识别转义字符

yaml参数引用

name: lisi
person:
name: ${name} # 引用上边定义的name值
  1. 读取配置文件内容

    application.yml

    server:
      port: 8082
    name: abc
    #对象
    person:
      name: ${name} #zhangsan
      age: 20
      address:
               - beijing
               - shanghai
    #行内写法
    person2: {name: zhangsan,age: 20}
    
    #数组
    address:
      - beijing
      - shanghai
    #数组行内写法
    address2: [beijing,shanghai]
    
    #纯量
    msg1: 'hello \n world' #不会识别转义字符,会原样输出
    msg2: "hello \n world" #会识别转义字符
    
    1. @Value
      在这里插入图片描述

    2. Environment
      在这里插入图片描述

    3. @ConfigurationProperties

      写一个实体类Person

      @Component //表示这个类被spring识别了,是一个been
      @ConfigurationProperties(prefix = "person")//绑定前缀
      @Data
      @ToString
      public class Person {
          private String name;
          private int age;
          private String[] address;
          
      }
      

    在这里插入图片描述

profile

我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库 地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。

  1. profile配置方式

    • 多profile文件方式

      提供多个配置文件,每一个代表一种环境:

      application-dev.properties/yml 开发环境
      application-test.properties/yml 测试环境
      application-pro.properties/yml 生产环境
      注意!:格式必须为application-xxx.properties/yml
      在这里插入图片描述

      在主配置文件(application.properties)中选择使用哪种配置:

      spring.profiles.active=xxx
      

在这里插入图片描述

  • yml多文档方式

    在yml文件内使用“ ”分割不同配置

    在这里插入图片描述

  1. profile激活方式

    • 配置文件

      即在主配置文件(application.properties)中配置

      spring.profiles.active=xxx
      
    • 虚拟机参数

      打开Edit Configurations进行配置
      在这里插入图片描述

      在Environment下设置VM options参数:
      -Dspring.profiles.active=pro

      在这里插入图片描述

      重新启动,虚拟机参数会覆盖配置文件配置

      在这里插入图片描述

    • 命令行参数

      1、打开Edit Configurations进行配置,在Environment下设置Program arguments参数: –spring.profiles.active=dev

      在这里插入图片描述

      重新启动,命令行参数会覆盖配置文件配置

      在这里插入图片描述

      2、打包项目,运行jar包命令行参数配置

      在这里插入图片描述

      进入打包好的jar文件目录,在target目录下,按住"Shift "+ 鼠标右键打开命令行窗口或者在当前文件目录下输入“cmd"回车。输入命令 :

      java -jar springboot-init-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro
      

      在这里插入图片描述

内部配置加载顺序

Springboot程序启动时,会从以下位置加载配置文件:

  1. file:./config/:当前项目下的/config目录下

  2. file:./ :当前项目的根目录

  3. classpath:/config/:classpath的/config目录(resources/config/application.properties)

  4. classpath:/ :classpath的根目录(resources/application.properties)

    加载顺序为上文的排列顺序,高优先级配置的属性会生效

在这里插入图片描述

外部配置加载顺序

通过官网查看外部属性加载顺序:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

在这里插入图片描述

使用打包方式,当前项目的根目录和当前项目下的/config目录下的配置文件application.properties不符合 maven结构,不会打进jar包。

运行jar包命令行参数方式修改端口号:

java -jar springboot-init-0.0.1-SNAPSHOT.jar --server.port=8082

指定默认访问路径:

java -jar springboot-init-0.0.1-SNAPSHOT.jar --server.servlet.context-path=/heihei

指定读取自定义本地配置文件:

java -jar springboot-init-0.0.1-SNAPSHOT.jar --spring.config.location=e://application.properties

1、进入打包好的jar文件目录,在target目录下,跟jar文件同级新建application.properties文件,通过命令行 java -jar springboot-init-0.0.1-SNAPSHOT.jar 会自动执行application.properties文件配置内容

2、在target目录下,跟jar文件同级新建config文件夹,文件夹内新建application.properties文件,通过命令行java -jar springboot-init-0.0.1-SNAPSHOT.jar 会自动执行application.properties文件配置内容,优先级大于第1种方式

外部文件配置与内部文件配置形成互补,外部配置优先生效。

SpringBoot整合其他框架

SpringBoot整合—Junit
  1. 创建SpringBoot工程

  2. 引入starter-test起步依赖

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-test</artifactId>
    	<scope>test</scope>
    </dependency>
    
  3. 编写测试类

    @Service
    public class UserService {
        public void add(){
            System.out.println("add...");
        }
    }
    
  4. 添加测试相关注解

    • @RunWith(SpringRunner.class)
    • @SpringBootTest(classes= 启动类.class)
  5. 编写测试方法

    @SpringBootTest(classes =  SpringbootInitApplication.class)
    //这里加不加classes取决于当前测试类包所在的位置
    //在引导类所在包的子包或同级则不需要加(会自动找引导类),否则要加
    public class UserServiceTest {
        @Autowired
        private UserService userService;
        @Test
        public void testAdd(){
            userService.add();
        }
    }
    
SpringBoot整合—Redis
  1. 创建SpringBoot工程

  2. 引入redis起步依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  3. 配置redis相关属性

    spring:
      redis:
        host: 127.0.0.1 #redis的主机ip
        port: 6379
    
  4. 注入RedisTemplate模板

  5. 编写测试方法,测试(需要开启本机redis)

    @SpringBootTest
    public class SpringBootRedisTests {
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        public void testSet() {
            redisTemplate.boundValueOps("name").set("zhangsan");
        }
        @Test
        void testGet() {
            //获取数据
            Object name = redisTemplate.boundValueOps("name").get();
            System.out.println(nme);
        }
    }
    
SpringBoot整合—MyBatis
  1. 创建SpringBoot工程

  2. 引入mybatis起步依赖,添加mysql驱动

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
  3. 编写DataSource和MyBatis相关配置

    在application.yml文件中加入DataSource配置

    spring:
      datasource:
        url: jdbc:mysql:///chenyanghotel?serverTimezone=UTC   #///表示localhost
        username: root
        password: '000909'  #这里需要加'',否则会报java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
        driver-class-name: com.mysql.cj.jdbc.Driver
    

    xml开发MyBatis相关配置:(用注解开发可以不用写MyBatis的配置)

    mybatis:
      mapper-locations: classpath:mapper/*Mapper.xml #mapper映射文件路径
      type-aliases-package: com.xiaozhi.springbootinit.entity #配置别名,注意要对应相应的实体类包名
      #config-location: 指定mybatis的核心配置文件
    
    
  4. 定义表和实体类

    在这里插入图片描述

    USE `chenyanghotel`;
    
    DROP TABLE IF EXISTS `user`;
    
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    insert  into user`(`id`,`name`,`password`) values (1,'张三','123456'),(2,'李四','123456');
    
    @Data
    @ToString
    public class User {
        private int id;
        private String name;
        private String password;
    }
    
    
  5. 编写dao和mapper文件/纯注解开发

    纯注解开发:

    @Mapper
    public interface UserMapper {
        @Select("select * from user")
        public List<User> findAll();
    }
    

    xml开发:

    @Mapper
    public interface UserXmlMapper {
        public List<User> findAll();
    }
    

    UserMapper.xml文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.xiaozhi.springbootinit.mapper.UserXmlMapper">
        <select id="findAll" resultType="User">
            select * from user
        </select>
    </mapper>
    
  6. 测试

    @SpringBootTest
    public class UserServiceTest {
        @Autowired
        private UserMapper userMapper;
        
        @Autowired
        private UserXmlMapper userXmlMapper;
    
        @Test
        public void findAll(){
            List<User> result = userMapper.findAll();
            for (User user: result) {
                System.out.println(user);
            }
        }
    
        @Test
        public void findAllXml(){
            List<User> result = userXmlMapper.findAll();
            for (User user: result) {
                System.out.println(user);
            }
        }
    }
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值