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邮件那样)