首页> 博客> SpringBoot 2.x 教你快速入门
17 01 2019
一、SpringBoot 简介
1.1、SpringBoot 是什么?
  • 产生背景:Spring开发变的越来越笨重,大量的XML文件,繁琐的配置,复杂的部署流程,整合第三方技术时难度大等,导致开发效率低下。
  • SpringBoot是一个用来简化Spring应用的初始化创建和开发的框架,简化配置,实现快速开发。
  • SpringBoot是SpringMVC的升级版,两者没有必然的联系,如果没有学习过SpringMVC的童鞋也可以直接上手SpringBoot。
1.2、为什么使用SpringBoot

优点:

  • 快速创建独立运行的Spring应用并与主流框架集成
  • 内置Servlet容器,应用无需打包war包
  • 使用starter(启动器)管理依赖并进行版本控制
  • 大量的自动配置,简化开发
  • 提供了准生产环境的运行时监控,如指标、 健康检查、外部配置等
  • 无需配置XML,没有生成冗余代码,开箱即用
  • 微服务的入门级框架
二、第一个SpringBoot应用
2.1、简介

前置知识:

  • 具备必要的前置知识 :
利用maven构建项目
Spring注解
RESTful API
  • 可以不需要先去学SpringMVC
  • Java、Maven等版本保持一致

推荐环境:

  • SpringBoot 2.0(基于Spring5.0)
  • JDK 1.8及以上
  • Maven 3.2及以上
  • Tomcat 8.5及以上
  • IntelliJ IDEA
2.2、步骤

可以在spring官网 https://start.spring.io/ 上建项目,也可以用idea构建。官网上直接生成项目如下:

本案例使用IDEA 来创建一个 SpringBoot 项目:

  • 新建一个SpringBoot项目,

  • 点击下一步:

  • 继续下一步:

  • 下一步,会开始下载选择的依赖包,等完成下载完成后,即创建成功。目录结构如下:

说明:

  1. 默认生成的.mvn、.gitignore等可以删除
  2. POM文件和主程序类都已经生成好了,直接写业务逻辑即可
  3. resources文件夹的目录结构
	|-resources
    	|-static  存放静态资源,如 css js images
    	|-templates  存放模板页,可以使用模板引擎,如freemarker、velocity、theamleaf等
    	|-application.properties  SpringBoot应用的配置文件
  • 新建一个 HelloController 类(最好保证启动类:GirlApplication 处于最外层路径哦,它会扫描加载同级目录或其下一级目录的文件)
package com.xmlvhy.girl.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

    @RequestMapping(value = "/hello" , method = RequestMethod.GET)
    public String say(){
        return "Hello SpringBoot!";
    }
}
  • 启动项目,有三种方式:

1. 在 IDEA 中启动,进入 GirlApplication 启动类中运行

2. 在项目根路径下执行maven命令: mvn spring-boot:run

3. 在项目跟路径下执行 maven 命令, 先执行 mvn install :

进入 target ,到target目录下后, 再执行 : java -jar girl-0.0.1-SNAPSHOT.jar

4. 启动成功后,访问:http://ip:端口/hello ,效果如下 :

三、属性配置文件
3.1、SpringBoot 配置文件默认有两种

文件名固定,放在 classpath:/ 或 classpath:/config 目录下 :

  • application.properties
  • application.yml
YAML用法:
	YAML不是一种标记语言
	YAML是专门用来写配置文件的语言,比xml、properties更适合作为配置文件
	YAML文件的后缀是.yml或.yaml

语法规则:
	大小写敏感
	使用缩进表示层级关系
	缩进时不允许使用Tag键,只允许使用空格
	缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
	`#`表示注释

根据个人喜好选择一种配置文件类型吧,我比较喜欢 application.properties ,本篇也是以这个为主!

3.2、SpringBoot 配置文件中添加属性

在 aplication.properties 文件中添加属性,如何在类文件中读取到属性呢 ?

#配置端口号
server.port=8082
#配置属性
name=jack
age=18

在HelloController类中读取 :

package com.xmlvhy.girl.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

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

	//在属性文件中无需指定数据类型,在类中声明类型即可
    @Value("${age}")
    private Integer age;

    @RequestMapping(value = "/hello" , method = RequestMethod.GET)
    public String say(){
        //return "Hello SpringBoot!";
        return name +" "+ age;
    }
}

浏览器地址栏中输入:http://localhost:8082/hello:

如果想要在配置文件中,引用配置文件中的属性,那么可以通过下面这种配置:

#配置端口号
server.port=8082
#配置属性
name=jack
age=18
content=name: ${name}, age: ${age}

Java类中同样方式引用:

package com.xmlvhy.girl.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

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

    @Value("${content}")
    private String content;
    @RequestMapping(value = "/hello" , method = RequestMethod.GET)
    public String say(){
        //return "Hello SpringBoot!";
        //return name +" "+ age;
        return content;
    }
}

效果如下:

可能有人会想到 : 两个属性还好,要是很多属性呢?那么我们继续修改配置文件,相当于建立一个分组,就需要用到这两个注解 : @Component @ConfiguartionProperties

新添加一些属性:

#配置端口号
server.port=8082
#配置属性
test.name=jack
test.age=18
test.sex=Man
#content=name: ${name}, age: ${age}

新建一个类 :

package com.xmlvhy.girl.entity;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * Author: 小莫
 * Date: 2019-01-17 21:29
 * Description:
 */
@Component //将当前Bean添加到容器中
//默认读取全局配置文件获取值,将当前类中的属性与配置文件中的test前缀进行绑定,这个可以自定义的
@ConfigurationProperties(prefix = "test")
@NoArgsConstructor //生成无参的构造方法
@Data //lombok插件的注解,默认帮生成 setter getter 和toString()方法
public class PersonProperties {
    private String name;
    private Integer age;
    private String sex;
}

在 HelloController 中引用 :

package com.xmlvhy.girl.web;

import com.xmlvhy.girl.entity.PersonProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

    //@Value("${name}")
    //private String name;
    //@Value("${age}")
    //private Integer age;
    //@Value("${content}")
    //private String content;
    @Autowired
    private PersonProperties personProperties;
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String say() {

        //return "Hello SpringBoot!";
        //return name +" "+ age;
        //return content;
        return personProperties.toString();
    }
}
3.3、SpringBoot 多环境配置

可以为不同环境提供不同中的配置信息,如开发环境、测试环境、生产环境。我们可以将application.properties 复制两份,分别命名(随意)为:application-dev.properties(表示开发环境) application-pro.properties(表示生产环境) :

具体使用哪一个配置,在主配置文件 application.properties 中指定 :

//表明使用开发环境下的配置
spring.profiles.active=dev
//表明使用生产环境下的配置
//spring.profiles.active=pro

当然,不管生产环境还是开发环境,主配置文件中的配置都会生效(一般都是各环境下通用的一些配置)

备注:java -jar 启动项目可以指定一种配置环境,这时候你也可以通过IDEA中启动同项目的另外一种配置环境,注意端口需要修改一下。这样也就实现多环境了

java -jar  girl-0.0.1-SNAPSHOT.jar –spring.profiles.active=pro
四、Controller的使用
4.1、简介
@Controller:处理http请求
@RestController:Spring4之后新的注解,原来返回json需要@ResponseBody配合@Controller
@RequestMapping:配置url映射

单独使用 Controller 注解时,在MVC里,是需要返回ModelAndView等类型的类或者页面;但如使用 @RestController 注解,表示给前端提供RESTful风格的接口返回一些json格式数据。

@Controller 这个和在spingmvc没啥区别;@RestController 用了这个之后,就可以省掉两个注解@Controller和@RequestBody。

@RestController = @ResponseBody + @Controller

4.2、处理请求中的参数
@PathVariable:获取url中的数据
@RequestParam:获取请求参数的值
@GetMapping: 组合注解 表示 @RequestMapping(value="...",method= RequestMethod.GET) 其他同理
@RequestMapping(value = "/get/{name}",method = RequestMethod.GET)
public String getName(@PathVariable String name){
    return name;
}

如上这种方式: @PathVariable 获取url中的数据例如 "/get/{name}",浏览器中输入:http://localhost:8082/get/小莫 ,看下效果:

那如果我们不传 name 呢?看会怎么样:

出错了,提示404找不到!!就是说url中必须要有这个参数。

我们接下来看下另外一种请求参数:

@RequestMapping(value = "/get")
  public String getId(@RequestParam("id") String id){
      return id;
}

@RequestParam获取请求参数的值,我们在浏览器地址栏中输入:http://localhost:8082/get?id=666666 ,效果如下:

如果我们访问这个:http://localhost:8082/get ,看下会有什么结果:

返回 400 ,客户端非法请求,提示请求参数 id 没有;这时候我们可以这样解决这个问题:

//required = false;表示该参数非必须
//defaultValue = "123456";表示没有填写参数时候默认给的参数值
@RequestMapping(value = "/get")
public String getId(@RequestParam(value = "id",required = false,defaultValue = "123456") String id){
        return id;
}

修改后,我们再次访问:http://localhost:8082/get ,效果如下:

这时候可以看到,不报错了,并且将我们设定的默认值 123456 返回来。同样我们在浏览器输入栏中输入:http://localhost:8082/get?id=666666

也能把我们预期的内容返回给我们。

五、操作数据库

SpringBoot 结合 Spring-Data-Jpa 使用,实现对数据库的操作。Spring-Data-Jpa 定义了一系列对象持久

化的标准,目前实现这一规范的产品有Hibernate.TopLink等。

5.1、POM.xml中添加相关依赖
<!--jpa的依赖jar-->
<dependency>
	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!--mysql 数据库的连接驱动-->
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.47</version>
</dependency>
5.2、新建一个实体类 User
package com.xmlvhy.girl.entity;

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * Author: 小莫
 * Date: 2019-01-18 17:43
 * Description:<描述>
 */
@Entity //表示该类映射数据库中的表
@Data //lombok插件注解,默认生成setter getter toString()方法,没有插件的话,自己手动生成即可
@NoArgsConstructor //无参构造方法,jpa 这块需要映射数据库的实体类有个无参的构造方法
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private Integer age;
}
5.3、添加数据库配置

首先我们先创建一个数据库: test (名称随意),然后在 application.properties 中添加如下配置:

#配置端口号
server.port=8082
#配置属性
test.name=jack
test.age=18
test.sex=Man
#content=name: ${name}, age: ${age}

#通用数据库配置
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=数据库账户
spring.datasource.password=数据库的密码

# Hikari 数据源专用配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5

#jpa相关配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#springboot 2.x 不加这句则默认为myisam引擎,该引擎不会事务回滚,添加如下可将引擎修改为innodb,事务可回滚
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

此时我们运行项目,查看数据库 test 。你会发现它自动帮我们生成一个 user 表:

这时候,我们可以添加一些数据,以便后面测试 :

5.4、创建一个 DAO 类
package com.xmlvhy.girl.Dao;

import com.xmlvhy.girl.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * Author: 小莫
 * Date: 2019-01-18 18:11
 * Description:<描述>
 */
//不需要添加任何注解 ,springboot 将接口类会自动注解到spring容器中,只需要继承JpaRepository(这个接口默认会提供给我们一些基础的数据库操作)
//第一个参数 User:表示接口对应的实体类 ;第二个参数 Integer : 表示该实体类对应表主键的类型
public interface UserRepository extends JpaRepository<User,Integer> {

}
5.5、创建 Service
  • 首先创建一个 service 的接口
package com.xmlvhy.girl.service;
import com.xmlvhy.girl.entity.User;
import java.util.List;

/**
 * Author: 小莫
 * Date: 2019-01-18 18:26
 * Description:<描述>
 */
public interface UserService {

    //获取所有的用户信息
    List<User>findAllUsers();

    //保存用户信息,这个方法主要是为了后面演示一下,事务回滚
    void saveUsers();
}
  • 创建一个 service 的实现类
package com.xmlvhy.girl.service.impl;

import com.xmlvhy.girl.Dao.UserRepository;
import com.xmlvhy.girl.entity.User;
import com.xmlvhy.girl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Author: 小莫
 * Date: 2019-01-18 18:27
 * Description:<描述>
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> findAllUsers() {
        return userRepository.findAll();
    }

    @Override
    public void saveUsers() {
        User user1 = new User();
        user1.setAge(10);
        user1.setName("小红");
        userRepository.save(user1);

        User user2 = new User();
        user2.setAge(10);
        user2.setName("小明");
        userRepository.save(user2);
    }
}
5.6、创建一个 Controller 类

编写一个 获取 user 的信息和保存用户的接口:

package com.xmlvhy.girl.web;

import com.xmlvhy.girl.entity.User;
import com.xmlvhy.girl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Author: 小莫
 * Date: 2019-01-18 19:45
 * Description:<描述>
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     *功能描述: 获取所有用户
     * @Author 小莫
     * @Date 19:48 2019/01/18
     * @Param []
     * @return List<User>
     */
    @GetMapping("/get")
    public List<User> getUsers(){
        return userService.findAllUsers();
    }

    /**
     *功能描述: 保存两个用户的信息
     * @Author 小莫
     * @Date 19:48 2019/01/18
     * @Param []
     * @return void
     */
    @RequestMapping("/save")
    public void saveUsers(){
        userService.saveUsers();
    }
}
5.7、运行项目,测试

打开浏览器,地址栏中输入:http://localhost:8082/user/get ,结果如下:

表明成功返回获取的数据。

此时我们访问:http://localhost:8082/user/save, 这时候成功结果会将我们设定好的两个数据插入数据库中,访问如果没什么异常,这时候查看数据库:

表明数据也成功插入进入了。

六、数据库事务管理
  • 数据库的事务,比如同时插入两条数据,但是其中一条失败了,另一条我就不希望它插入了.希望的结果要么两个同时成功,要么都不成功(场景:如商家卖东西,客户扣款商家扣库存,要么操作都失败要么都成功!要不然会出事的~)

  • 一般情况下,只有查询的时候不加事务,其它任何操作都要加事务。springboot在Service类的方法前加上@Transactional 注解即可。也可以在每个方法上添加事务,会默认以方法上添加的事务为前提,如果没有就以service类上的注解为准

  • SpringBoot 2.x JPA 默认引擎为 myisam ,这个不支持事务回滚,会出现添加事务注解,但是无效的情况。此时在application.properties 中,需要将引擎修改为innodb,这个是支持事务回滚的!

#不加这句则默认为myisam引擎,该引擎不会事务回滚,添加如下:在application.properties 中可将引擎修改为 innodb
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

我们来模拟一个异常,在service中,修改一下 saveUsers 这个方法,通过是用事务和不使用事务来对比看一下:

 @Override
    public void saveUsers() {
        User user1 = new User();
        user1.setAge(10);
        user1.setName("小杰");
        userRepository.save(user1);

        //模拟一个异常
        int i = 10/0;

        User user2 = new User();
        user2.setAge(10);
        user2.setName("小明");
        userRepository.save(user2);
    }

此时,我们重新build项目,然后访问一下:http://localhost:8082/user/save ,会提示服务器内部错误,从报错可以看出是我们设定的场景!然后再去看一下数据库,看小杰 有没有保存进入数据库:

发现小杰的数据插入数据库了,小明的没有插入成功,因为小明的数据插入前出现我们设定的异常了

那么我们如何避免这种情况呢?我们希望的是要么两个都失败,要么都成功!这就需要事务管理了!修改如下:

	@Transactional
	@Override
    public void saveUsers() {
        User user1 = new User();
        user1.setAge(10);
        user1.setName("加事务还能保存吗");
        userRepository.save(user1);

        //模拟一个异常
        int i = 10/0;

        User user2 = new User();
        user2.setAge(10);
        user2.setName("小明");
        userRepository.save(user2);
    }

再次build项目,然后我们在访问保存用户的接口:http://localhost:8082/user/save ,你会发现,虽然还会报同样的异常,但是事务起作用了,也就是说,加事务还能保存吗 这条数据也不能保存到数据库中了。这就实现了事务的回滚!

以上便是SpringBoot 2.x 快速入门的所有内容,教你快速创建一个Web项目!

本内容涉及的代码:获取源码

另外,提供一套免费学习视频,这套课程原本在慕课网最受欢迎的一套 2 小时入门 SpringBoot,老师讲的不错,但是由于内容中影响不好,被慕课官方下架了,网友提供录制版本,蛮清晰的。仅供学习使用!

视频获取地址:https://pan.baidu.com/s/1Clpnwxacn2SIOh4w3_rSiA

类似文章

  1. SpringCloud入门系列之服务链路追踪Sleuth&Zipkin
  2. SpringCloud入门系列之微服务之间的通信
  3. SpringCloud入门系列之API网关
  4. SpringCloud入门系列之配置中心
  5. SpringCloud入门系列之Eureka注册中心

评论区

| 0 评论

还没有评论,快来抢沙发吧!