SpringBoot高级整合 尚硅谷雷锋阳 学习笔记

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记

这里写目录标题

  • SpringBoot高级整合 尚硅谷雷锋阳 学习笔记
  • Springboot与缓存
    • JSR107缓存规范
    • Spring缓存抽象
    • 代码实现
      • 搭建基本环境
      • 体验缓存
      • Cacheable运行流程
      • Cacheable其他属性
      • Cacheput
      • CacheEvict 清除缓存
      • Caching(三合一)
    • Redis
      • redis环境搭建
      • Redis环境搭建
    • 自定义CacheManger
  • SpringBoot 与消息
  • SpringBoot 与检索
  • SpringBoot 与任务(异步,定时,邮件 任务)
  • SpringBoot 与安全
  • SpringBoot 与开发热部署
  • SpringBoot 与监控管理
    • 各端点测试
    • 定制端点
    • 自定义Healtindicator

Springboot与缓存

JSR107缓存规范

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第1张图片
相信大家都能看得懂
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第2张图片
使用JSR107需要导入下面的依赖包
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第3张图片

Spring缓存抽象

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第4张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第5张图片

代码实现

搭建基本环境

在这里插入图片描述

创建数据库
在这里插入图片描述

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `departmentName` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `lastName` VARCHAR(255) DEFAULT NULL,
  `email` VARCHAR(255) DEFAULT NULL,
  `gender` INT(2) DEFAULT NULL,
  `d_id` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO employee(lastName,email,gender,d_id)VALUES('zhangsan','[email protected]',1,1);
INSERT INTO employee(lastName,email,gender,d_id)VALUES('lisi','[email protected]',0,2);

建两个bean实体类

package com.luyi.bean;

/**
 * @author 卢意
 * @create 2020-11-24 9:00
 */
public class Department {
	private Integer id;
	private String departmentName;


	public Department() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Department(Integer id, String departmentName) {
		super();
		this.id = id;
		this.departmentName = departmentName;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getDepartmentName() {
		return departmentName;
	}
	public void setDepartmentName(String departmentName) {
		this.departmentName = departmentName;
	}
	@Override
	public String toString() {
		return "Department [id=" + id + ", departmentName=" + departmentName + "]";
	}
}

package com.luyi.bean;

/**
 * @author 卢意
 * @create 2020-11-24 9:01
 */
public class Employee {
	private Integer id;
	private String lastName;
	private String email;
	private Integer gender; //性别 1男  0女
	private Integer dId;


	public Employee() {
		super();
	}


	public Employee(Integer id, String lastName, String email, Integer gender, Integer dId) {
		super();
		this.id = id;
		this.lastName = lastName;
		this.email = email;
		this.gender = gender;
		this.dId = dId;
	}

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Integer getGender() {
		return gender;
	}
	public void setGender(Integer gender) {
		this.gender = gender;
	}
	public Integer getdId() {
		return dId;
	}
	public void setdId(Integer dId) {
		this.dId = dId;
	}
	@Override
	public String toString() {
		return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + ", dId="
				+ dId + "]";
	}
}

application里添加Mybatis配置


spring.datasource.url=jdbc:mysql://localhost:3306/spring_cache?serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=123456
#Driver可不写,会根据连接自动添加
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#开启驼峰命名规则
mybatis.configuration.map-underscore-to-camel-case=true
#开启日志
logging.level.com.luyi.mapper=debug

新建mapper接口
package com.luyi.mapper;

import com.luyi.bean.Employee;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

/**
 * @author 卢意
 * @create 2020-11-24 9:04
 */
public interface EmployeeMapper {
	@Select("SELECT * FROM employee WHERE id=#{id}")
	Employee getEmpById(Integer id);

	@Insert("INSERT INTO employee(lastName,email,gender,d_id)VALUES(#{lastName},#{email},#{gender},#{dId})")
	void insertEmployee(Employee employee);

	@Update("UPDATE employee SET lastName=#{lastName},email=#{email},gender=#{gender},d_id=#{dId} WHERE id=#{id}")
	void updateEmp(Employee employee);

	@Delete("DELETE FROM employee WHERE id=#{id}")
	void deleteEmpById(Integer id);

}

新建test类

package com.luyi;

import com.luyi.mapper.EmployeeMapper;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.security.RunAs;

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringbootstudyApplicationTests {

	@Autowired
	EmployeeMapper employeeMapper;

	@Test
	void contextLoads() {
		employeeMapper.getEmpById(1);
	}

}

查找成功
在这里插入图片描述
新建Employeeservice

package com.luyi.service;

import com.luyi.bean.Employee;
import com.luyi.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author 卢意
 * @create 2020-11-24 9:10
 */
 @Service
public class EmployeeService {
	@Autowired
	EmployeeMapper employeeMapper;

	public Employee getEmp(Integer id){
		System.out.println("查询" + id + "号员工");
		Employee emp = employeeMapper.getEmpById(id);
		return emp;
	}
}

新建controller类

package com.luyi.controller;

import com.luyi.bean.Employee;
import com.luyi.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 卢意
 * @create 2020-11-24 9:12
 */
@RestController
public class EmployeeController {

	@Autowired
	EmployeeService employeeService;

	@GetMapping("/emp/{id}")
	public Employee getEmployee(@PathVariable("id") Integer id){
		Employee emp = employeeService.getEmp(id);
		return emp;
	}

}

启动项目
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第6张图片
没加缓存时 每次访问都会调用数据库
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第7张图片

体验缓存

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第8张图片

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第9张图片
主启动类加上开启缓存注解
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第10张图片
service 放法加入缓存注解
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第11张图片
缓存的key编写
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第12张图片

先只用默认的注解进行测试
在这里插入图片描述
只查询了一次 就没有在调用数据库了
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第13张图片

Cacheable运行流程

自动配置类导入了下面的缓存配置类
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第14张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第15张图片

生效的缓存配置类
在这里插入图片描述
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第16张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第17张图片

Cacheable其他属性

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第18张图片
用配置类指定key
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第19张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第20张图片
condition
第一个参数大于1 在进行缓存
在这里插入图片描述
unless 否定缓存 第一个参数等于2 就不缓存
在这里插入图片描述
sync异步模式 将返回值异步存在缓存中 不支持unless

Cacheput

既调用方法,又更新缓存
@CachePut与@Cacheable的区别
@Cacheable是先到缓存里查找有没有要查的数据,如果有就直接用缓存里的数据,不调用方法操作数据库,如果没有再调用方法操作数据库并把返回的数据保存到缓存里。(前置处理)(用于查询)
@CachePut是每次都先调用方法进行数据库操作,并把返回的数据保存到缓存里,如果缓存里已经有了就覆盖原来的数据。(后置处理)(用于修改)
运行时机:先调用目标方法,再将目标方法的返回结果保存到缓存中。(属性比@Cacheable少了一个sync,其他相同)
应用场景:修改了数据库的某个数据,同时更新缓存。
mapper里添加

@CachePut(value = "emp")
   public Employee updateEmp(Employee employee){
   	System.out.println("updateEmp:" + employee);
       employeeMapper.updateEmp(employee);
       return employee;
  }

EmployeeController类内添加

@GetMapping("/emp")
   public Employee update(Employee employee){
       Employee emp = employeeService.updateEmp(employee);
       return emp;
   }

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第21张图片

CacheEvict 清除缓存

mapper添加方法

@CacheEvict(value = "emp", key = "#id")
public void deleteEmp(Integer id){
    System.out.println("deleteEmp:" + id);
    //数据库只有两个数据,这里就不删除了,只清理缓存中的数据
    //employeeMapper.deleteEmpById(id);
}

conroller类

@GetMapping("/delemp")
public String deleteEmp(Integer id){
    employeeService.deleteEmp(id);
    return "success";
}

key默认使用传参的值

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第22张图片

Caching(三合一)

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第23张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第24张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第25张图片
全局配置 value="emp"就可以不写了
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第26张图片

Redis

在这里插入图片描述

redis环境搭建

启动redis
在这里插入图片描述

Redis环境搭建

pom 文件添加依赖

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

配置redis

spring.redis.host=192.168.216.138 

springboot 自动配置redisTemplateSpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第27张图片
使用

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第28张图片

Redis常见的五大数据类型
String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)
stringRedisTemplate.opsForValue() String(字符串)
stringRedisTemplate.opsForList() List(列表)
stringRedisTemplate.opsForSet() Set(集合)
stringRedisTemplate.opsForHash() Hash(散列)
stringRedisTemplate.opsForZSet() ZSet(有序集合)
redisTemplate的方法和stringRedisTemplate是一样的,不同的是redisTemplate操作k-v都是对象的,而操作k-v都是字符串的
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第29张图片
测试redisTemplate

@Test
public void test02(){
    Employee employee = employeeMapper.getEmpById(1);
    //如果保存对象,默认使用jdk系列化机制,系列化后的数据保存到redis中
    redisTemplate.opsForValue().set("emp01", employee);  //append是追加字符串的,set才是添加对象的,并且每次提交相同的key时,原来的value会被新的value覆盖
}

需要将Employee变成可序列化
在这里插入图片描述
默认的序列化器是jdk的
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第30张图片
将数据以json的形式保存到redis:
自己将对象转为json(如使用gson)
修改redisTemplate默认的系列化(默认使用的是jdk的系列化器)我们想修改成json的序列化器

新建一个MyRedisConfig配置类

@Configuration
public class MyRedisConfig {

    @Bean
    public RedisTemplate<Object, Object> empRedisTemplate(RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        //设置默认的系列化器为Jackson2JsonRedisSerializer
        template.setDefaultSerializer(serializer);
        return template;
    }
}
//自定义RedisTemplate
@Autowired
RedisTemplate<Object, Object> empRedisTemplate;

@Test
public void test03(){
    Employee employee = employeeMapper.getEmpById(1);
    empRedisTemplate.opsForValue().set("emp01", employee);
}

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第31张图片

自定义CacheManger

现在引入了Redis 默认的缓存配置 SimpleCacheConfiguration不生效了 因为他的触发条件是没有CacheManager的类才生效
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第32张图片
RedisCacheConfiguration的启动顺序比SimpleCacheConfiguration高 提前判断生效 放入RedisCacheManagerSpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第33张图片

自定义redisCachemanager
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第34张图片
这个样子就相当于我们容器内有了CacheManager 就不会去注册上面的默认缓存 查出来的也是默认序列化为josn的数据
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第35张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第36张图片
新建一个Department的操作 进行缓存查询 第一次走数据库查询成功 将缓存存入
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第37张图片
第二次走缓存查询就有问题了 上面写着无法从Department的json对象转为Emloyee的反序列化
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第38张图片
因为这里配了Employee的序列化对象

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第39张图片
那就只能在写一个部门的Template对象和部门的缓存管理器

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第40张图片

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第41张图片
使用的时候需要指定CacheManager

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第42张图片

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第43张图片
多个CacheManager需要定义一个主键CacheManager(默认使用)
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第44张图片

编码的方式使用redis缓存
指定缓存管理器
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第45张图片

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第46张图片

SpringBoot 与消息

https://blog.csdn.net/weixin_43691773/article/details/109295391

SpringBoot 与检索

https://blog.csdn.net/weixin_43691773/article/details/109442332

SpringBoot 与任务(异步,定时,邮件 任务)

https://blog.csdn.net/weixin_43691773/article/details/109472499

SpringBoot 与安全

https://editor.csdn.net/md/?articleId=109143604

SpringBoot 与开发热部署

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第47张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第48张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第49张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第50张图片

SpringBoot 与监控管理

各端点测试

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第51张图片
控制台会有映射信息
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第52张图片
尝试访问监控信息 发现没有授权
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第53张图片
修改配置文件 将管理安全模式给关闭
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第54张图片

从新进入
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第55张图片
各字段功能
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第56张图片

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第57张图片
远程关闭程序
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第58张图片

定制端点

SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第59张图片
更改bean的访问路径和id 都是 mybean和/mybean
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第60张图片
也可以单独设置路径
在这里插入图片描述

不让beans端点被访问 需要在配置文件加入
在这里插入图片描述
值开启beans端点
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第61张图片
在这里插入图片描述
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第62张图片
定义端口号
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第63张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第64张图片

自定义Healtindicator

当前健康检查 只有一个diskpace健康状态
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第65张图片
springboot自带很多组件的健康检查
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第66张图片
引入redis依赖个配置 就可以进行redis的健康检查
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第67张图片
自定义健康状态指示器
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第68张图片
SpringBoot高级整合 尚硅谷雷锋阳 学习笔记_第69张图片

你可能感兴趣的:(Springboot整合系列,spring,boot)