springboot学习

springboot学习

一、spingBoot简介

优点:简化spring应用的初始搭建与开发过程。

1.1、springboot的开发步骤

1.1.1、创建新模块

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

1.1.2、创建controller

在这里插入图片描述

1.1.3、启动服务器

在这里插入图片描述

1.1.4、进行测试

在这里插入图片描述

1.2、springboot工程快速启动

1.2.1、问题引入

后端和前端开发人员协同开发,前端人员测试前端程序需要后端开发开启服务器,不利于前端开发。后端可以将springboot工程打包成jar包,该jar包不依赖于tomcat和idea也可以正常运行,只需要这个jar包在运行过程中连接和程序相同mysql数据库即可。

1.2.2、快速启动

在这里插入图片描述

在这里插入图片描述

  • 总结:启动的效果和idea中运行引导类的效果同

1.2.3、端口被占用

  • 当端口被占用时,需要杀死正在占用该端口的任务。
    在这里插入图片描述

1.2.4、更改启动端口

  • 当端口被占用时,不能杀死正在占用端口的重要任务时,需要改变端口
    在这里插入图片描述

1.2.5、属性加载的优先顺序

在这里插入图片描述

1.2.6、临时属性设置(开发环境)

为了确保前端开发人员在快速启动时使用临时属性可以成功,后端开发人员需要对临时属性进行测试。

  • 1使用Program arguments设置临时属性
    在这里插入图片描述
  • 2通过编程形式带参数启动
    在这里插入图片描述
  • 3不携带参数启动
  • 在这里插入图片描述

1.3、springboot概述

springboot继承的项目定义了坐标的版本号(依赖管理而非依赖)。

1.3.1、起步依赖

  • 用来解决spring程序依赖设置繁琐的问题。含有starter就是起步依赖。
  • 以起步依赖spring-boot-starter-web为例。进入该依赖,查看pom.xml的依赖会发现里面引入了spring-web和spring-webmvc等依赖。以达到减少依赖配置的目的。
  • 故以后需要使用技术,只需要引入该技术对应的起步依赖即可。

1.3.2、parent

所有springboot项目要继承的项目,定义了若干坐标版本号,以达到减少依赖冲突的问题。

1.3.3、项目启动

在这里插入图片描述

  • 因为我们在pom.xml中配置了spring-boot-starter-web依赖,这个依赖也依赖了tomcat,所以运行main方法就可以使用tomcat启动工程。

1.3.4、切换web服务器

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

  • 小结:springboot换技术时只需要导入该技术的起步依赖即可。

二、配置文件

2.1、配置文件格式

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

  • springboot程序的配置文件名必须是application,只是后缀名不同。

2.1.1、三种配置方式的优先级

在这里插入图片描述

2.2、yaml格式

  • YAML(YAML Ain’t Markup Language),一种数据序列化格式。
  • 格式的发展过程:xml->properties->yaml
  • .yaml和.yml(主流)都是ymal的文件扩展名

2.2.1、yaml格式的优势

容易阅读,重数据轻格式
在这里插入图片描述

2.2.2、yaml格式的语法规则

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

在这里插入图片描述

2.2.3、yaml文件中的变量引用

  • 在配置文件中可以使用${属性名}方式引用属性值。
    在这里插入图片描述

2.3、yaml配置文件数据读取

在这里插入图片描述

2.3.1、使用@Value注解

使用@Value读取配置文件中的信息。
在这里插入图片描述

2.3.2、Environment对象(封装全部配置信息)

上面方式读取到的数据特别零散,SpringBoot还可以使用@Autowired自动装配自动实现依赖注入。这种方式SpringBoot会将配置文件中所有的数据封装到Environment对象中,如果需要使用哪个数据只需要通过调Environment对象的getProperty(String name)方法获取。
具体代码如下:
在这里插入图片描述

2.3.3、自定义对象(常用)

  • 将实体类bean的创建交给Spring管理。在类上添加@Component注解
  • 使用@ConfigurationProperties注解表示加载配置文件,在该注解中也可以使用prefix属性指定只加载指定前缀的数据
  • 在BookController中进行注入
  • 在这里插入图片描述
  • 在这里插入图片描述
    在这里插入图片描述
  • 注意:使用这种方式会在实体类中产生如下警告,在pom.xml中添加依赖spring-boot-configuration-processor即可解决警告提示。
    在这里插入图片描述
    在这里插入图片描述

2.4、多环境配置

以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同。来回的修改配置会很麻烦,SpringBoot给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。

在这里插入图片描述

  • 不同类型的配置文件多环境开发的配置都不相同,接下来对不同类型的配置文件进行说明

2.4.1、yaml文件

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

2.4.2、properties文件(了解)

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

2.4.3、命令行启动参数设置

  • SpringBoot提供了在运行jar时设置开启指定的环境的方式。
    在这里插入图片描述

2.4.4、多环境开发兼容问题(maven和springboot)(此处和maven高级学习中资源配置不同)

如果启动jar包的话,maven用来最终打包,应该起主导作用。若maven中配置了多环境,那么application.yml从pom.xml读取选择哪个环境。

  • maven中在pom.xml中配置多环境属性
    在这里插入图片描述

  • springboot中引用maven属性

在这里插入图片描述

  • 对资源文件开启对默认占位符的解析
    在这里插入图片描述

2.5、配置文件分类

2.5.1、问题引入

由于测试环境和开发环境的很多配置都不相同,测试人员在运行我们的工程时需要临时修改很多配置。
在这里插入图片描述

2.5.2、解决方案

springboot定义了配置文件不同的放置位置;放在不同位置的优先级是不同的。
不同优先级的文件只有在冲突的时候,高优先级的覆盖低优先级。而没有冲突的部分全部沿用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.6、日志

2.6.1、日志的作用

记录开发调试和运维过程消息

2.6.2、日志的级别

在这里插入图片描述

2.6.3、日志组

在application.yml配置文件中。控制指定分组(组内可以指定包)对应的日志输出等级。
在这里插入图片描述

2.6.4、使用注解快速添加日志对象

在这里插入图片描述

2.6.5、文件记录日志

项目出现问题需要查看日志时,为防止值日丢失,需要将其记录在文件内
在这里插入图片描述

三、springboot整合junit

SpringBoot整合junit特别简单,分为以下三步完成:

  • 在测试类上添加SpringBootTest注解
  • 使用@Autowired注入要测试的资源
  • 定义测试方法进行测试

3.1、前期准备

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

3.2、编写测试类

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

四、springboot整合mybatis

springboot不存在整合spring(springboot开发spring程序)和springmvc(只需要把起步依赖引进来就行了)。

4.1、回顾spring整合mybatis

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

4.2、springboot整合mybatis

4.2.1、创建模块

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

4.2.2、定义实体类

在这里插入图片描述

4.2.3、定义dao接口

在com.itheima.dao包下定义BookDao接口,内容如下
在这里插入图片描述

4.2.4、编写配置

在这里插入图片描述

4.2.5、定义测试类

在这里插入图片描述

4.2.6、测试

运行测试方法

4.2.7、使用Druid数据源(这里是使用不是整合)

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

五、springboot整合第三方技术通用方式

  • 导入对应的starter
  • 配置格式

5.1、springboot整合druid

在这里插入图片描述

六、SSMP(springmvc+springboot+MP)整合案例

6.1、创建工程

在这里插入图片描述

6.2、使用lombok简化实体类

在这里插入图片描述

6.3、配置类

整合Druid
在这里插入图片描述

6.4、Dao接口

在这里插入图片描述

6.5、业务层

Service接口名称定义成业务名称,并与Dao接口名称进行区分

  • service接口
    在这里插入图片描述
  • service接口的实现类
    在这里插入图片描述
  • 注: 在这里插入图片描述

6.6、业务层的快速开发

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

6.6、表现层的开发

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

6.7、表现层消息一致性处理

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

6.8、静态资源

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

6.9、页面结果

在这里插入图片描述

开发实用篇

一、热部署

定义:不用重新启动项目,也可以让修改的代码生效

  • 热部署只是重启(仅仅加载当前开发者自定义的java类资源,不加载jar资源。),而启动项目包含重启和重载
    在这里插入图片描述

1.1、手动启动热部署

在这里插入图片描述

1.2、自动启动热部署

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

1.3、热部署范围配置

  • 可以设置哪些项不被热部署监测
    在这里插入图片描述

1.4、禁用热部署

在这里插入图片描述

二、配置高级

2.1、@ConfigurationProperties

在这里插入图片描述

在这里插入图片描述

  • 注:使用@ConfigurationProperties会出现警告
    在这里插入图片描述

2.1.1@EnableConfigurationProperties和@ConfigurationProperties的区别

在这里插入图片描述

2.2、宽松绑定

在这里插入图片描述

在这里插入图片描述

2.3、常用计量单位(时间、空间)

设置的计量单位决定的是控制台输出的单位
在这里插入图片描述
在这里插入图片描述

2.4、数据校验

校验是否获得的数据是否满足要求,如需要int,获得char型的,就需要给出提示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、测试

3.1、加载测试专用属性

目的是缩小应用范围,仅在该测试类中有效
在这里插入图片描述

3.2、web环境模拟测试(测试表现层)

测试表现层
在这里插入图片描述

3.2.1、模拟开发环境

在这里插入图片描述

3.2.2、模拟请求

在这里插入图片描述

3.2.3、各部分测试

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

  • 整合上述对不同部分的测试(有一部分不满足预期就会报错)
 @Test
    void testGetById(@Autowired MockMvc mvc) throws Exception {
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
        ResultActions action = mvc.perform(builder);

        StatusResultMatchers status = MockMvcResultMatchers.status();
        ResultMatcher ok = status.isOk();
        action.andExpect(ok);

        HeaderResultMatchers header = MockMvcResultMatchers.header();
        ResultMatcher contentType = header.string("Content-Type", "application/json");
        action.andExpect(contentType);

        ContentResultMatchers content = MockMvcResultMatchers.content();
        ResultMatcher result = content.json("{\"id\":1,\"name\":\"springboot\",\"type\":\"springboot\",\"description\":\"springboot\"}");
        action.andExpect(result);
    }

3.3、业务层测试事务回滚

在对业务层进行测试的时候,常常会在我们的数据库中留下痕迹。我们可以通过事务回滚进行无痕操作。
@Transactional
@Rollback
在这里插入图片描述

3.4、测试用例数据设定

测试用例通常采用随机值进行测试
在这里插入图片描述
在这里插入图片描述

四、数据层解决方案

4.1、sql(关系型数据库)

现在我们使用的技术如下,springboot可以内置技术来代替以下技术
在这里插入图片描述

4.1.1、数据源配置

当我们使用druid数据源时,配置如下:
在这里插入图片描述

在这里插入图片描述

4.1.2、数据层解决方案–jdbcTemplate

比MP麻烦。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1.3、内嵌数据库

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

4.2、NoSQL(非关系型数据库)

在这里插入图片描述

4.2.1、redis的安装和基本使用

服务器启动:redis-server.exe redis.windows.conf
客户端启动:redis-cli.exe
在这里插入图片描述
在这里插入图片描述

4.2.2、springboot整合redis

  • 导入redis坐标
  • 配置redis(默认配置时可省略)
  • 写测试(注意运行时需要启动redis服务器)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4.2.3、RedisTemplate和StringRedisTemplate(常用)

  • RedisTemplate以对象作为key和value。StringRedisTemplate以字符串作为key和value,与Redis客户端操作等效
  • 使用StringRedisTemplate读写的数据和使用cmd启动的客户端读写的数据时互通的。故建议使StringRedisTemplate。
    在这里插入图片描述

4.2.4、redis客户端技术的选择

redis客户端默认使用lettuce。但是如果升级系统的时候,以前用的是jedis,那么为了防止出错,升级后还是需要使用jedis的。
jedis存在线程安全问题,解决方案可以通过配置连接池使每个连接专用。lettcus是线程安全的。
在这里插入图片描述
在这里插入图片描述

4.2.5、Mongodb的安装和启动

  • 开源、无模式的文档数据库
  • 一些数据(有很高的修改需求,如游戏中的药的数量、直播数据打赏数据等)不适合进数据库,
Mongo启动

在这里插入图片描述

可视化客户端Robo 3T

在这里插入图片描述

4.2.6、Mongodb基础CRUD

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

4.2.7、springboot整合Mongodb

  • pom.xml添加坐标
  • 配置文件
  • 测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4.2.8、ES简介

是一个分布式全文搜索引擎。
索引(普通数据库):id(主键)->数据
倒排索引:关键字->id(主键)->部分数据
文档:关键字+id(主键)+部分数据=一条文档
在这里插入图片描述

4.2.9、ES的启动

在这里插入图片描述

4.2.10、ES索引操作

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

IK分词器

有了分词器,ES才能够识别关键词
在这里插入图片描述

4.2.11、ES文档操作CRUD

创建

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

查询

在这里插入图片描述

删除

在这里插入图片描述

修改

在这里插入图片描述

4.2.12、springboot整合ES客户端

SpringBoot平台并没有跟随ES的更新速度进行同步更新,ES提供了High Level Client客户端操作ES。springboot的仍然使用着低水平的客户端。故选择高水平客户端,自己手动整合。
在这里插入图片描述
在这里插入图片描述

  • 创建索引
 @Test
    void testCreateIndexByIK() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("books");
        String json = "{\n" +
                "    \"mappings\":{\n" +
                "        \"properties\":{\n" +
                "            \"id\":{\n" +
                "                \"type\":\"keyword\"\n" +
                "            },\n" +
                "            \"name\":{\n" +
                "                \"type\":\"text\",\n" +
                "                \"analyzer\":\"ik_max_word\",\n" +
                "                \"copy_to\":\"all\"\n" +
                "            },\n" +
                "            \"type\":{\n" +
                "                \"type\":\"keyword\"\n" +
                "            },\n" +
                "            \"description\":{\n" +
                "                \"type\":\"text\",\n" +
                "                \"analyzer\":\"ik_max_word\",\n" +
                "                \"copy_to\":\"all\"\n" +
                "            },\n" +
                "            \"all\":{\n" +
                "                \"type\":\"text\",\n" +
                "                \"analyzer\":\"ik_max_word\"\n" +
                "            }\n" +
                "        }\n" +
                "    }\n" +
                "}";
        //设置请求中的参数
        request.source(json, XContentType.JSON);
        client.indices().create(request, RequestOptions.DEFAULT);
    }
  • 添加文档
@Test
    //添加文档
    void testCreateDoc() throws IOException {
        Book book = bookDao.selectById(1);
        IndexRequest request = new IndexRequest("books").id(book.getId().toString());
        String json = JSON.toJSONString(book);
        request.source(json,XContentType.JSON);
        client.index(request,RequestOptions.DEFAULT);
    }
  • 批量添加文档
@Test
    //添加文档
    void testCreateDocAll() throws IOException {
        List<Book> bookList = bookDao.selectList(null);
        BulkRequest bulk = new BulkRequest();
        for (Book book : bookList) {
            IndexRequest request = new IndexRequest("books").id(book.getId().toString());
            String json = JSON.toJSONString(book);
            request.source(json,XContentType.JSON);
            bulk.add(request);
        }
        client.bulk(bulk,RequestOptions.DEFAULT);
    }
  • 按条件查询
@Test
    //按条件查询
    void testSearch() throws IOException {
        SearchRequest request = new SearchRequest("books");//索引
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.termQuery("all","spring"));//all是name和description的合并,spring是关键词
        request.source(builder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            //System.out.println(source);
            Book book = JSON.parseObject(source, Book.class);//把json格式转换为对象
            System.out.println(book);
        }
    }

五、整合第三方技术

5.1、缓存

缓存:减少数据读取过程(减少磁盘io),提高性能。缓存还可以存储临时数据(如给手机发送验证码,数据库利用缓存临时存储验证码,等待用户输入验证码进行验证)。
springboot为了对其他缓存技术进行整合,统一了接口(不同的缓存技术接口都一样,只需要更换实现类即可)
在这里插入图片描述
在这里插入图片描述

5.1.1、springboot整合缓存

@EnableCaching
@Cacheable:会放入缓存,会从缓存中取出
@CachePut:会放入缓存,不会从缓存中取出(方便同一key的数据进行覆盖)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.1.2、缓存供应商变更:Ehcache

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

  • ehcache.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <diskStore path="D:\ehcache" />
    <!--默认缓存策略 -->
<!--    name:cache存储的空间的名字-->
    <!-- external:是否永久存在,设置为true则不会被清除,此时与timeout冲突,通常设置为false-->
    <!-- diskPersistent:是否启用磁盘持久化-->
    <!-- maxElementsInMemory:最大缓存数量-->
    <!-- overflowToDisk:超过最大缓存数量是否持久化到磁盘-->
    <!-- timeToIdleSeconds:最大不活动间隔,设置过长缓存容易溢出,设置过短无效果,可用于记录时效性数据,例如验证码-->
    <!-- timeToLiveSeconds:最大存活时间-->
    <!-- memoryStoreEvictionPolicy:缓存清除策略-->
    <defaultCache
        eternal="false"
        diskPersistent="false"
        maxElementsInMemory="1000"
        overflowToDisk="false"
        timeToIdleSeconds="60"
        timeToLiveSeconds="60"
        memoryStoreEvictionPolicy="LRU" />
    <cache
        name="smsCode"
        eternal="false"
        diskPersistent="false"
        maxElementsInMemory="1000"
        overflowToDisk="false"
        timeToIdleSeconds="100"
        timeToLiveSeconds="100"
        memoryStoreEvictionPolicy="LRU" />
</ehcache>

5.1.3、缓存供应商变更:Redis

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

5.1.4、缓存供应商变更:mencached

  • 下载memcached
    地址:https://www.runoob.com/memcached/window-install-memcached.html
  • 安装mencached
    在这里插入图片描述

安装:memcached.exe -d install
在这里插入图片描述
启动:memcached.exe -d start
停止:memcached.exe -d stop

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

5.1.5、缓存供应商变更:jetcache

优点在于既有本地缓存也有远程缓存(注意这里的缓存区别于前面的springcache,也不使用前面的注解)
@EnableCreateCacheAnnotation:jetcache启用缓存的主开关
@CreateCache:定义有关cache的属性。写在业务层实现类中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

使用方法注解

1@EnableMethodCache(basePackages = “包名”):必须和@EnableCreateCacheAnnotation一起使用,开启方法注解
2@Cached(name = “smsCache_”, key = “#id”, expire = 3600)
3@CacheRefresh(refresh = 10,timeUnit = TimeUnit.SECONDS)
4@CacheUpdate(name = “smsCache_”, key = “#book.id”, value = “#book”)
5@CacheInvalidate(name = “smsCache_”, key = “#id”)

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

5.1.6、缓存供应商变更:j2cache

目的:配置多级缓存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2、任务

定时任务,如:商品定点上架,生成年度报表。这些需要精准时间的任务,人为操作也不合理。
定时任务框架:Quartz,Spring Task

5.2.1、SpringBoot整合Quartz(麻烦,不推荐)

在这里插入图片描述

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

5.2.2、spring Task(简化,推荐)

@EnableScheduling:开启定时任务功能
@Scheduled(cron = “0/5 * * * * ?”):设定执行周期,从0s开始每隔5s执行一次
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3、邮件

5.3.1、SpringBoot整合JavaMail

  • 发送简单邮件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    注:完成以上步骤即可发送简单邮件(类似qq邮件那样)
    在这里插入图片描述

5.4、消息

补充

隐藏文件或文件夹

在这里插入图片描述

复制工程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值