目录 前言 需求背景 事件概念 定义 组成 事件实现 时序图 前言 前段时间因为工作的需要用到Spring事件,翻翻文档将功能实现了,但是存在少许理解不畅的地方,今天有空来梳理梳理. 需求背景 叶子同学在新入职公司,老大让他实现登陆功能,叶子随手写完,上线无bug,一切安好 //登陆伪代码 public void login(....){ userLogin(....); } 几天之后,老大说为维护用户的粘度,每天登陆送积分.叶子同学,二话不说,一顿操作后,上线无bug,一切安好 //登陆伪代码
java
Java Spring 事件监听详情解析
使用feign配置网络ip代理
目录 feign配置网络ip代理 问题描述 1.依赖 2.feignclinet接口 3.Config 4.yml 调用指定ip的feign接口 feign配置网络ip代理 问题描述 测试环境将需要访问的外网地址加入了白名单,但是docker和宿主机网络不一样(试过挂载宿主机网络也不行,但是挂载宿主机网络会打乱原有的网络环境),所以造成了在宿主机上面可以访问该地址,但是docker里面是访问不到外网的地址,所使用feign的时候加上ip代理,代理宿主机ip来对外网地址进行访问! 为什么不直接对d
基于Java 利用Mybatis实现oracle批量插入及分页查询
目录 1.单条数据insert 2.批量数据批量insert 3.创建序列 4.oracle分页查询 前端与后端交互,分页查询 后端海量数据导出,批量查询 1.单条数据insert <!--简单SQL--> insert into userinfo (USERID, USERNAME, AGE) values(1001,'小明',20); <!--Mybatis写法1,有序列,主键是自增ID,主键是序列--> <insert id="insert" par
详解Thymeleaf的三种循环遍历方式
目录 循环遍历list集合 1.实体类 2.控制类 3.each.html 循环遍历map集合 1.控制类 2.each.html 循环遍历数组 循环遍历list集合 1.实体类 使用lombok插件,省去getter和setter,toString等方法的书写 代码 package com.springboot_thyleaf2.model; import lombok.Data; @Data public class User { private Integer id; private St
详谈StringUtils3之StringUtils.isEmpty()和StringUtils.isB的区别
目录 #isEmpty系列 StringUtils.isEmpty() StringUtils.isNotEmpty() StringUtils.isAnyEmpty() StringUtils.isNoneEmpty() #isBank系列 StringUtils.isBlank() StringUtils.isNotBlank() StringUtils.isAnyBlank() StringUtils.isNoneBlank() StringUtils的其他方法 也许你两个都不知道,也许你
java返回json请求中文变成问号的问题及解决
目录 java返回json请求中文变成问号 json返回中文全是问号 java返回json请求中文变成问号 原来在个人项目时,用layui的数据表格获取数据时,不会出现中文变问号问题 后来换了个项目,发现返回的json数据到页面中文变成了???问号. 于是开始排查问题出现的原因,首先jsp页面头部确保使用了UTF-8编码: <%@ page language="java" contentType="text/html; charset=UTF-8" pageE
Springboot允许logger.debug输出日志方式
目录 Springboot允许logger.debug输出日志 SpringBoot启动debug级别日志报错 错误截图 原因 解决办法 Springboot允许logger.debug输出日志 说实话对日志这东西一直只是太肤浅的懂,就会用logger.info和logger.error输出,今天在写LemonRobot项目的时候,决定把调试信息也打出来,然后根据日志级别控制让上线的时候不显示debug级别的日志. 但是运行后发现,默认logger.debug产生的日志也没有输出到控制台,经过一
springboot如何去除debug日志
目录 springboot去除控制台打印的debug日志 1.创建logback-spring.xml文件 2.给application.properties文件 无法控制springboot中的debug日志 问题 最后试了一下,这样解决的 springboot去除控制台打印的debug日志 1.创建logback-spring.xml文件 文件内容如下 <?xml version="1.0" encoding="UTF-8"?> <config
SpringBoot之跨域过滤器配置允许跨域访问方式
目录 SpringBoot跨域过滤器配置允许跨域访问 跨域请求 问题背景 跨域过滤器 跨域功能改进 SpringBoot跨域设置(CORS) 一.什么是跨域 二.跨域资源共享(CORS) 1. 简单请求 2. 非简单请求 三.SpringBoot设置CORS SpringBoot跨域过滤器配置允许跨域访问 跨域请求 当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求. 出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求. 例如,XMLHttp
详解SpringBoot中@SessionAttributes的使用
目录 简介 概述 代码 后端代码 前端代码 测试 简介 说明 本文介绍SpringBoot中@SessionAttributes的用法. 概述 在默认情况下,ModelMap中的属性作用域是request级别,也就是说,当本次请求结束后,ModelMap 中的属性将销毁.如果希望在多个请求中共享ModelMap中的属性,必须将其属性转存到session 中,这样 ModelMap 的属性才可以被跨请求访问. Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 sessi
解决Java中new BigDecimal()的坑
目录 new BigDecimal()的坑 关于BigDecimal用法 1.实例 BigDecimal 对象 2. BigDecimal 加减乘除 3. Scale 属性操作 4. compareTo 比较大小 new BigDecimal()的坑 先看一段代码示例: System.out.println(new BigDecimal(0.99)); System.out.println(new BigDecimal("0.99")); System.out.println(BigD
springboot +rabbitmq+redis实现秒杀示例
目录 实现说明 1.工具准备 2.数据表 3.pom 4.代码结构 5.配置config 6.订单业务层 7.redis实现层 8.mq实现层 9.redis模拟初始化库存量 10.controller控制层 11.测试 12.测试结果 实现说明 这里的核心在于如何在大并发的情况下保证数据库能扛得住压力,因为大并发的瓶颈在于数据库.如果用户的请求直接从前端传到数据库,显然,数据库是无法承受几十万上百万甚至上千万的并发量的.因此,我们能做的只能是减少对数据库的访问.例如,前端发出了100万个请求,
在Java中实现让线程按照自己指定的顺序执行
目录 如何让线程按照自己指定的顺序执行 认识Join 利用Executors线程池 线程的优先级及执行顺序 优先级概述 使用优先级 如何让线程按照自己指定的顺序执行 我们在日常的多线程开发中,可能有时会想让每个线程都按照我们指定的顺序来运行,而不是让CPU随机调度,这样可能会让我们在日常的开发工作中带来不必要的麻烦. 既然有了这个需求,也就引入了本文的标题,让线程按照自己指定的顺序来运行. 有兴趣的同学可以猜想下列代码可能运行的结果: 按照正常的理解思路,上面代码的执行顺序依次应该为:t1 →
SpringBoot如何用java生成静态html
目录 SpringBoot集成Freemarker 1. 引入Maven依赖 2. 创建ftl 3. 创建freeMarker工具类 4. 编写Java的代码 5. Html输出 SpringBoot集成Freemarker 主要特征:静态页面,无接口交互 数据实时性不高且体量小的网站可采用生成静态html的形式 数据提前渲染至html内,若发生数据更新,则重新渲染数据 CDN加速让网站不再龟速 1. 引入Maven依赖 <dependency> <groupId>org.
springboot整合redis之消息队列
目录 一.项目准备 二.配置类 三.redis中list数据类型 定时器监听队列 运行即监控队列 四.发布/订阅模式 五.ZSet实现延迟队列 一.项目准备 依赖 <!-- RedisTemplate --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &
Springboot上传文件时提示405问题及排坑过程
目录 Springboot上传文件时提示405 解决方案1 解决方案2 Springboot使用过程中遇到的一些问题 异常一 异常二:Mysql连接报错 异常三:整合Druid密码解密失败 Springboot上传文件时提示405 问题描述:上传文件时请求不通,状态码返回405,如下图: 问题分析:405 Method Not Allowed,请求行中指定的请求方法不能被用于请求相应的资源.该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表.简单说就是请求方法不支持
Java实现世界上最快的排序算法Timsort的示例代码
目录 背景 前置知识 指数搜索 二分插入排序 归并排序 Timsort 执行过程 升序运行 几个关键阀值 运行合并 合并条件 合并内存开销 合并优化 背景 Timsort 是一个混合.稳定的排序算法,简单来说就是归并排序和二分插入排序算法的混合体,号称世界上最好的排序算法.Timsort一直是 Python 的标准排序算法.Java SE 7 后添加了Timsort API ,我们从Arrays.sort可以看出它已经是非原始类型数组的默认排序算法了.所以不管是进阶编程学习还是面试,理解 Tim
Java线程池使用AbortPolicy策略
目录 线程池ThreadPoolExecutor的拒绝策略 AbortPolicy策略 线程池ThreadPoolExecutor的拒绝策略 线程池中的线程资源全部被占用时,对新添加的Task任务有不同的处理策略,在默认的情况下, ThreadPoolExecutor类中有4种不同的处理方式: AbortPolicy:当任务添加到线程池中被拒绝时,它将抛出RejectExecutionException异常. CallerRunsPolicy:当任务添加到线程池中被拒绝时,会使用调用线程池的Th
为什么不建议使用Java自定义Object作为HashMap的key
目录 前言 踩坑历程回顾 hashCode覆写的讲究 为什么hashCode和equals要同时覆写 数据退出机制的兜底 总结 前言 此前部门内的一个线上系统上线后内存一路飙高.一段时间后直接占满.协助开发人员去分析定位,发现内存中某个Object的量远远超出了预期的范围,很明显出现内存泄漏了. 结合代码分析发现,泄漏的这个对象,主要存在一个全局HashMap中,是作为HashMap的Key值.第一反应就是这里key对应类没有去覆写equals()和hashCode()方法,但对照代码仔细一看却
Java实现JDK动态代理的原理详解
目录 概念 案例 静态代理 JDK动态代理模式 原理分析 真相大白 概念 代理:为控制A对象,而创建出新B对象,由B对象代替执行A对象所有操作,称之为代理.一个代理体系建立涉及到3个参与角色:真实对象(A),代理对象(B),客户端. 其中的代理对象(B)起到中介作用,连通真实对象(A)与客户端,如果进一步拓展,代理对象可以实现更加复杂逻辑,比如对真实对象进行访问控制. 案例 需求:员工业务层接口调用save需要admin权限,调用list不需要权限,没权限调用时抛出异常提示. 静态代理 /**