zoukankan      html  css  js  c++  java
  • SpringBoot 入门

    认识Spring boot

    什么是Spring boot

    Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

    Most Spring Boot applications need minimal Spring configuration.

    简单的说Springboot 是一个用于加速构建基于Spring的应用程序的框架,你可以把他叫做Spring集成框架,Spring敏捷开发框架;

    Spring boot,让创建一个可用于生产级别的Spring应用程序变得非常简单,大多数Springboot应用程序需要仅最少的Spring配置。

    ok,可以看得出Springboot并不是提供了某种新功能而是,将原来繁琐的框架整合变得更简单了;这样一来我们便可以专注于务逻辑的实现;

    为什么需要Spring?

    原因很简单了,以往在开发一个基于Spring的web项目时我们需要编写大量的配置文件,非常的耗时和低效,且容易出错,但是我们也会发现大多数应用程序的配置信息都是一样的,在这个敏捷开发大行其道的时代,Java也需要有一个能够大幅加快开发速度的框架,Spring boot应运而生, 我相信即使没有Spring boot 也会出现这样一个框架;

    创建Spring-web项目过程对比

    回顾一下我们以往在开发一个ssm项目时我们要做什么事情:

    • 安装tomcat,用于部署最后产生的war
    • 创建一个Maven项目,添加各个框架所需要的依赖包,这是还需要考虑依赖的版本兼容问题
    • 创建,编写一堆看起来复杂,但又重复的配置文件,整合各个框架到Spring中
    • 业务开发
    • 测试-打包,发布到tomcat

    Spring boot:

    • 默认将tomcat打包到项目中作为默认服务器,(应用程序自己包含了tomcat)
    • 创建一个Maven项目,当然你可以不创建直接去官网下载一个空项目
    • 在pom中添加需要集成的框架的starter(启动器),starter会自动完成框架与Spring的整合和配置
    • 一个简单的spring boot配置文件,仅需要提供少数必需的配置如jdbc参数
    • 业务开发
    • 直接运行main方法,或者使用maven运行,或者打包为jar 通过java -jar命令行运行

    需要注意的是Spring boot 是需要依赖构建工具的,可以是maven和gradle;

    Spring boot的核心功能

    1. 起步依赖(starter)

      起步依赖本质上就是一个pom,(项目对象模型),其中包含了某个框架/功能运行所需的基础依赖信息,当我们需要某个框架/功能时加入该框架/功能的依赖即可

    2. 自动配置

      Spring Boot会在启动时完成对各个框架的自动配置,考虑了众多因素,最终决定Spring配置应该用哪个,不该用哪个, 该过程是Spring自动完成的;

    3. 内置tomcat 或jetty等servlet容器

    4. 没有代码生成,不需要XML配置

    5. 尽可能自动配置Spring容器中的bean;

    入门程序

    案例

    1. 创建基础的maven过程

    2. 在pom中继承SpringBoot的starter,这决定了该工程是一个Spring boot工程

      注意这不是依赖,而是继承关系,就像一个class一样,通过继承拥有父类的功能

      <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.2.4.RELEASE</version>
      </parent>
      
    3. 在pom中添加web的starter依赖,告诉maven,web应用需要用到的依赖有哪些,只需要加进来就可以,Spring boot 将会自动完成响应的配置

      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      </dependencies>
      
    4. 编写Spring boot引导类,为spring boot提供一个启动入口

      //引导类不允许放在根目录下
      @SpringBootApplication
      public class Application {
          public static void main(String[] args) {
              //启动Spring boot 需要指定引导类
              SpringApplication.run(Application.class);
          }
      }
      
    5. 创建一个用于测试的controller

      @RestController
      public class HelloController {
          @RequestMapping("/hello/{name}")
          public String helloTest(@PathVariable String name){
              return "hello spring : "+name;
          }
      }
      

      此时工程目录如下:
      image-20200314174154671

    6. 运行主函数,启动应用
      image-20200314174310200

    7. 浏览器访问http://localhost:8080/hello/aaa,tomcat默认运行在808端口,可通过控制台查看

    注意:引导类不能放在根目录下;

    通过maven插件来运行

    maven可以帮助我们在运行前检查依赖关系

    1. 添加插件

      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
      </plugins>
      
    2. maven命令

      spring-boot:run

    整合mybatis

    添加了starter-web起步依赖后,工程就完成了Spring 和SpringMVC相关依赖和整合配置,我们已经可以处理客户端的请求并返回响应了,但是我们的数据是存储在数据库的,需要整合mybatis到项目中

    添加starter和JDBC驱动

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.1</version>
    </dependency>
    <!--mybatis不能确定我们要链接的数据库类型 所有需要手动导入MySQL驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    

    准备数据

    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` char(10) DEFAULT NULL,
      `password` char(12) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    INSERT INTO `user` VALUES (1,'admin','123321'),(2,'jerry','123'),(3,'22','222');
    

    创建实体Bean

    public class User {
        private Integer id;
        private String username;
        private String password;
        set/get
    }
    

    创建Mapper接口

    package com.yyh.mapper;
    import com.yyh.pojo.User;
    import java.util.List;
    @Mapper //mybatis 能识别带有该注解的mapper
    public interface UserMapper {
        public List<User> selectAllUser();
    }
    

    创建Mapper映射文件

    <?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.yyh.mapper.UserMapper">
        <select id="selectAllUser" resultType="user">
            select * from user
        </select>
    </mapper>
    

    测试控制器

    @RestController
    public class UserController {
    
        @Autowired
        private UserMapper userMapper;
        
        @GetMapping("/user/list")
        @ResponseBody
        public List<User> getAllUsers(){
            return userMapper.selectAllUser();
        }
    }
    

    创建配置文件

    在resources下创建名称为application.properties的文件,内容如下,另外spring还支持yml格式的配置文件

    #DB Configuration:
    spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?
    serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=admin
    #spring集成Mybatis环境
    #pojo别名扫描包 mybatis.type-aliases-package=com.yyh.pojo
    

    指定扫描mapper所在的包

    若没有使用@Mapper注解需要在启动类中添加扫描包信息

    @SpringBootApplication
    @MapperScan("com.yyh.mapper")
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }
    

    maven编译设置

    默认情况下,maven在打包时会将java目下的*.java 以及resource下的配置文件诸如(*.xml,*.properties)等编译到target中,这个两个文件夹都属于classpath,一些人为了方便查找可能会将mapper文件和接口文件一起放在java目录下,但是maven并不会将java目录下的xml进行编译的,这时可以在pom中指定要编译的目录信息

     <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.*</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
    

    使用thymeleaf模板引擎

    在这之前我们一直在使用jsp来作为视图层,但是jsp必须依赖servlet容器,浏览器无法直接渲染jsp文件每次开发调试想要看到最新的效果都必须重新编译jsp,所以Spring boot 并不推荐我们使用jsp,视图层可以使用模板引擎,目前主流的有thymeleaf,和freemaker,官方推荐thymeleaf;

    Spring boot 提供了thymeleaf的默认配置,所以在spring boot 中使用thymeleaf非常方便,Spring boot 还设置了thymeleaf的默认视图解析器,可以像操作jsp一样来操作Thymeleaf。Controller层几乎没有任何区别,就是在模板语法上有区别。

    需要强调的是:模板依然是在后端完成渲染(前后端不分离),运行流程和jsp是一样的,关于thymeleaf详细用法不是本章的重点,参见官网

    添加Thymeleaf的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    

    编写Thymeleaf模板

    注意:模板必须放到src/main/resources/templates目录下。

    <!DOCTYPE html>
    <!--添加名称空间后idea可以提示补全-->
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>user list</title>
    </head>
    <body> 用户列表:<br>
    <table border="1">
        <tr>
            <th>id</th>
            <th>username</th>
            <th>password</th>
        </tr>
        <tr th:each="user:${userList}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.username}"></td>
            <td th:text="${user.password}"></td>
        </tr>
    </table>
    </body>
    </html>
    

    Service

    @Service
    public class UserServiceImpl  implements UserService {
        @Autowired
        private UserMapper mapper;
    
        public List<User> getAall(){
            return mapper.selectAllUser();
        }
    
    }
    

    Controller

    @RestController
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @GetMapping("/user/list")
        @ResponseBody
        public List<User> getAllUsers(){
            return userService.getAall();
        }
    }
    

    访问测试:

    url:http://localhost:8080/user/show

    热部署插件

    当我们controller和service开发完毕调试视图时,热部署可以在检测到页面修改后自动重新加载,方便调试

    1.添加插件依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <!--若不生效可以在build中配置fork 表示插件在独立的进程中运行-->
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <fork>true</fork>
      </configuration>
    </plugin>
    

    2.打开IDEA自动编译

    File-Settings-Compiler-Build Project automatically
    3.允许运行过程中自动生成

    ctrl + shift + alt + /,选择Registry,勾上 Compiler autoMake allow when app running

    静态资源访问

    在SpringMVC中需要手动配置静态资源的映射关系,而Spring boot 默认以及添加了静态资源的配置,可以将静态资源请求映射到resources下的static目录

    在static下放置一张图片:

    |--resources

    ​ |--static

    ​ yelloman.jpg

    浏览器直接访问:http://localhost:8080/yellowman.jpg

    我们来看一下目前的目录结构:

    image-20200317175856818

    这也是一个Spring boot过程基本的目录结构

    Junit测试

    当我们需要单独测试容器中某个bean时,从头到尾的执行一遍业务逻辑是非常耗时的,这时就可以Junit来进行单元测

    添加起步依赖:

    <dependency>
    		<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    import java.util.List;
    @RunWith(SpringRunner.class) 
    @SpringBootTest(classes = Application.class)//启动类
    public class BootTest {
    
      	//注入需要测试的bean
        @Autowired
        UserService userService;
    
        @Test
        public void test1() {
            List<User> aall = userService.getAall();
            System.out.println(aall);
    
        }
    }
    

    也可以使用SpringJUnit4ClassRunner来作为测试引擎@RunWith(SpringJUnit4ClassRunner.class)

  • 相关阅读:
    直线方程和直线系方程
    多个参数之和积的取值范围
    解析几何习题
    React之Perf
    一文看懂npm、yarn、pnpm之间的区别
    Cannot read property 'properties' of undefined
    为什么要用PolyFill(JS中的修补匠)
    es6-promise
    原生js实现each方法
    有趣的js获取input标签中光标的索引
  • 原文地址:https://www.cnblogs.com/yangyuanhu/p/12527899.html
Copyright © 2011-2022 走看看