学习目标:

理解spring的优缺点
理解springboot的特点
理解springboot核心功能
搭建springboot环境
能够完成application.properties配置文件的配置
能够完成application.yml配置文件
集成mybatis junit springdata jpa

spring的优缺点:

配置过于复杂。
项目中的jar包版本冲突没有解决。

springboot概述以及解决方案:

不用写业务 和 配置之间总是切换。
基于spring开发提供更快的入门体验
不配置也能用,配置也能用。
提供了许多业务之外的功能。比如安全、健康监测、外部配置。
他不是spring的增强,而是能够让你更快速的使用spring

springboot的核心功能:

起步依赖
自动配置

springboot快速入门:

1 创建maven工程
2 注入依赖关系

<parent>
		<!--所有的springboot工程都要继承这个依赖-->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.1.RELEASE</version>
  </parent>
<dependencies>
  	<!--基于web功能的依赖  在springboot中都是以功能为单位
  		按功能来添加jar包-->
      <dependency>	
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
  </dependencies>

3 创建引导类
在src - main中创建com.itrucheng.MySpringBootApplication类

package com.itrucheng;/*
 * auth:熊汝成
 * date:2020/2/1
 * description:
 */

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication      //这说明底下的类一个引导类
public class MySpringBootApplication {
	//main方法只是代表程序的入口
    public static void main(String[] args) {
    	//run方法要运行引导类,将其字节码作为参数
        SpringApplication.run(MySpringBootApplication.class);
    }
}

然后运行主类就可以了。

4 编写控制类
一定要在引导类的同级或者子级目录下构建控制类
MyController.java

package com.itrucheng 或者 com.itrucheng.controller
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @RequestMapping("/quick")
    @ResponseBody
    public String quick() {
        return "hello world";
    }
}

热部署的配置

  1. 添加热部署功能依赖
<dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-devtools</artifactId>
</dependency>
  1. 修改idea的一些设置
    首先在settings -> compiler ->勾选Build project automatically
    再 ctrl+shift+alt+/,点击registry,再勾选.running 即可

这样,就可以不用重启项目直接修改代码了


利用IDEA快速构建项目


SpringBoot的起步依赖原理

在前面介绍的starter-parent以及starter-web将一些基本的数据进行了封装。
在starter-parent中

<resource>
                <filtering>true</filtering>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>**/application*.yml</include>
                    <include>**/application*.yaml</include>
                    <include>**/application*.properties</include>
                </includes>
            </resource>
            <resource>

发现它会默认读取resources下的以application开头的文件,这些都是放配置文件的。
当进入starter-parent的父文件starter-dependencies,发现它将所有的jar版本进行了固定,这样就做到了版本控制,解决了版本带来的冲突。

同样的道理,进入starter-web当中,我们也发现,它将需要的jar包(springmvc、spring、hibernate校验等)的坐标都收集起来,然后封装成starter-web,这样就实现了以功能为单位,摒弃了繁琐的jar的形式。

就是这种封装,做到了其起步依赖


SpringBoot的自动配置原理

从引导类入手,点开@SpringBootApplication,再逐步点开@EnableAutoApplication等等注解,会最终发现,其自动配置的内容再org.springframework.boot:spring-boot-autoconfigure包下->META-INF下的spring.factory中,而默认的数据则保存在spring-configuration-metadate.json当中,内容+数据,实现了自动配置。

如果我们需要修改自动配置的内容,只需要在resources下建立application开头的文件,然后对应spring-configuration-metadate.json中的内容进行修改就可以了


关于获取yml中的数据

yml的格式

#普通数据的配置
name: zhangsan

#对象数据的配置
person:
  name: lisi
  age: 20
  addr: beijing

server:
  port: 8081

#普通集合的配置
cities:
  - beijing
  - tianjing
  - guangzhou

#对象集合的配置
students:
  - name: wangwu
    age: 20
    addr: beijing
  - name: zhaoliu
    age: 30
    addr: shenzheng

#map的配置
map:
  key1: value1
  key2: value2

1.使用@Value获取yml中的数据

@RestController
public class MyController {

    @Value("${}")
    private String name;

    @Value("${person.age}")
    private Integer age;


    @RequestMapping("/quick")
    public String quick() {
        return "name:"+name+"  age:"+age;
    }
}

2.使用@ConfigurationProperties获取
首先先建立一个JavaBean

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component  //一定要将这个bean注入到容器当中,才能使用下面的注解
@ConfigurationProperties(prefix = "person") //将yml的对象前缀加进去
public class Person {
	//要添加get set方法才行		
    private String name;
    private String addr;
    private Integer age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", addr='" + addr + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

再到控制类中获取

@RestController
public class MyController {


    @Autowired			//从容器中获取person
    private Person person;

    @RequestMapping("/quick")
    public String quick() {
        return person.toString();
    }
}

配置Configuration-processor

为什么要配置,因为配置了以后,在写javabean的属性后,就可以在yml中自动显示要有的属性。
如何配置,只需要添加如下依赖便可:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>

整合Mybatis

步骤如下:

1.导入依赖
2.添加数据库连接信息
3.创建表和实体类
4.编写mapper接口与mapper.xml
5.完成springboot与mybatis连接关系

1.导入依赖

<!--添加mybatis的起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

    <!--添加数据库驱动坐标,由于版本控制,不需要写版本号,但高版本存在一些问题,于是我们手动将版本降低-->
     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.34</version>
     </dependency>

2.添加数据库连接关系
我们在application.properties中添加如下关系:

#添加数据库的连接信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mdb?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=密码

当然,以上这些元数据还是可以再org.springframework.boot:spring-boot-autoconfigure的json中找到这些配置信息。

3.创建表和实体类

package com.itrucheng.domain.Custom;
public class Custom {

    private String custom_id;
    private String name;
    private String phone;
    private String place;

    public get/set();
    public toString();
}

4.编写接口与xml

接口:

package com.itrucheng.mapper;
import com.itrucheng.domain.Custom;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper         //添加到spring容器当中,相当于以前的dao
public interface CustomMapper {

    public List<Custom> queryAll();
}

再到resource下创立mapper文件夹,并建立CustomMapper.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.itrucheng.mapper.CustomMapper">		<!-- 接口名要用全名,没有别名 -->

    <select id="queryAll" resultType="com.itrucheng.domain.Custom">
        select * from custom;
    </select>

</mapper>

5.将mybatis与springboot融合
其实就是在application.properties当中添加一些信息:

#配置mybatis的信息
#为了找到mapper接口对于的xml文件,由于编译完后,这些文件是直接放在类路径下。
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

同理可以在mybatis.spring.boot的json当中找到,为了简单,我们直接只配置一个最必要的信息

6.编写控制类来测试

@RestController //采用此种方式绝不会出bug
public class MybatisController {

    @Autowired  //将容器当中的CustomMapper获取出来,报红线没有关系
    private CustomMapper customMapper;

    @RequestMapping("/find")
    public List<Custom> find() {
        return customMapper.queryAll();

    }
}

补充:

1.有关xml头文件注入依赖的解决方案: