![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 78
浩骞
做同样的事情,时间不一样,心情不一样,结果也不一样,不忘初衷才能有所收获
展开
-
将 Bean 注入 Spring 容器的方法
spring 注入 bean 的5种方式原创 2022-12-17 23:05:48 · 1226 阅读 · 1 评论 -
自定义线程池工具类
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.concurrent.*;/** * 线程池工具类(单例) */public class MyThreadPoolUtils<T> { private static final Logger LOGGER = LoggerFactory.getLogger(MyThreadPoolUtils.class); // 等待队原创 2022-02-03 00:24:27 · 10025 阅读 · 0 评论 -
JAVA IO操作笔记
目录1 文件1.1 文件常用操作1.1.1 创建文件1.1.2 获取文件信息1 文件文件在程序中以流的形式来操作的,输入流 与 输出流 中的 输入与输出针对的是内存。File继承关系1.1 文件常用操作1.1.1 创建文件 /** * 创建文件 方法1 * <p> * new File(String pathname) */ @Test public void createFile_test01() {原创 2022-01-30 17:53:50 · 1214 阅读 · 0 评论 -
JAVA stream流详细教程
目录1、什么是流2、如何生成流3、流的操作类型3.1、中间操作3.2、终端操作4、流的使用4.1 中间操作filter 筛选distinct 去重limit 返回指定流个数skip 跳过流中的元素map 流映射flatMap 流转换allMatch 匹配所有元素anyMatch匹配其中一个noneMatch全部不匹配4.2 终端操作count 统计流中元素个数findFirst 查找第一个findAny 随机查找一个reduce 将流中的元素组合min/max 获取最小最大值sum / summingxxx原创 2021-10-25 00:02:46 · 41876 阅读 · 7 评论 -
常用的设计模式:动态代理
目录![在这里插入图片描述](https://img-blog.csdnimg.cn/3d94ffc6de464ae2843ee0849209f70c.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/8556e9ca957449c9953b07081d54b8f2.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/567c850eb5b6412194f458d283d3bf81.png)...转载 2021-09-27 02:36:09 · 284 阅读 · 0 评论 -
springboot 中动态切换数据源(多数据源应用设计)
目录数据库项目结构启动类entitycontrollerservicemapper配置文件线程上下文 (DataSourceHolder)动态数据源 DynamicDataSource数据源配置AOP测试验证最近在做一个租户隔离的项目,要求不同租户数据放入不同的数据库实现物理隔离,涉及到多个数据库的应用,除了使用数据库中间件,还想到了一个不错的解决方案,就是动态切换当前请求线程的数据源。所以写篇文章来记录一下。本文使用了 springboot + mybatis-plus项目源码可以参考https原创 2021-09-26 01:17:36 · 5041 阅读 · 0 评论 -
Spring Boot + Redis 实现 API 接口防刷
目录项目结构添加依赖:pom.xml修改配置文件定义防刷注解:AccessLimit定义MVC拦截器 FangshuaInterceptor(核心)添加配置类controller接口上使用防刷注解演示效果项目结构添加依赖:pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redi原创 2021-08-15 18:27:13 · 374 阅读 · 0 评论 -
Spring Session 实现分布式环境下session共享问题
目录http请求是无状态的问题session 原理分布式环境下,session丢失问题(无法共享问题)session会话共享解决方案1 nginx方案2. tomcat方案3 Spring Session + Redis (推荐)http请求是无状态的问题http请求是无状态的,用户免登录等问题需要记录用户登录状态(即需要请求有状态),为了解决这个问题引入了 浏览器端的cookie 和 服务器端的session这里要引入一个概念sessionid,session对象当客户端首次访问时,创建一个新的原创 2021-08-15 00:32:21 · 786 阅读 · 0 评论 -
springboot 统一异常处理
0 问题在日常开发中你是否遇到过这样的问题:当程序出现异常响应给前端的数据格式不是你预期想要的如图所示:为了返回统一的响应格式,每次代码中都需要手动捕获异常,然后返回统一格式,写法可能会是这样:import lombok.extern.slf4j.Slf4j;@Slf4j@RestControllerpublic class EmployeeController { @GetMapping("testCustomException/{num}") @TraceLog原创 2021-07-10 00:54:18 · 358 阅读 · 1 评论 -
springboot整合logback 打印日志文件、定制日志格式
1 实现第一步:在resources路径下创建日志的配置文件 logback-spring.xml文件内容如下:<?xml version="1.0" encoding="UTF-8"?><!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --><!-- scan :此属性设置为true时,配置文件发生改变,将原创 2021-07-10 00:32:57 · 1396 阅读 · 2 评论 -
ThreadLocal 的使用心得
目录1.ThreadLocal 介绍2.ThreadLocal 的API2.1 ThreadLocal 核心方法:2.2 ThreadLocal 初始化:initialValue()2.3 ThreadLocal 初始化:withInitial()3 使用场景3.1 场景一:ThreadLocal 实现时间格式化3.2 场景二:跨类传递数据4 总结1.ThreadLocal 介绍ThreadLocal 从字面的意思来理解是线程本地变量的意思,也就是说它是线程中的私有变量,每个线程只能使用自己的变量。原创 2021-05-20 16:04:33 · 1226 阅读 · 1 评论 -
SpringBoot 集成 WebSocket 实现服务端消息主动推送
目录1 什么是websocket?2 使用Springboot开始整合webSocket3 前端websocket客户端4 测试验证项目中用到了websocket进行大屏数据实时获取,今天写个聊天室demo来进行总结;1 什么是websocket?WebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工通信,学过计算机网络都知道,既然是全双工,就说明了服务器可以主动发送信息给客户端。这与 推送技术 或者是 多人在线聊天 的功能不谋而合。为什么不使用HTTP 协议呢?这原创 2021-05-20 13:35:33 · 9769 阅读 · 10 评论 -
使用ulisesbocchio对spring-boot项目properties.yml(bootstrap.yml)配置文件加密
Spring-boot项目中properties文件中的密码明文上传到公开的远程仓库后,不安全,可以使用Ulisesbocchio对配置文件进行加密1.添加maven依赖:<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.1</v原创 2021-04-23 10:34:00 · 2507 阅读 · 0 评论 -
Hystrix 的两种隔离方式
hystrix 隔离模式目前有两种方式:信号量 模式和 线程池 模式。1 为什么进行线程隔离hystrix的一项核心功能,就是所谓的资源隔离,资源隔离要解决的最核心的问题,就是将多个依赖服务的调用分别隔离到各自的资源池内。避免对某一个依赖服务的调用,因为依赖服务的接口调用的延迟或者失败,导致服务所有的线程资源全部耗费在这个服务的接口调用上。一旦某个服务的线程资源全部耗尽的话,可能就导致服务就会崩溃,甚至说这种故障会不断蔓延hystrix,资源隔离提供了两种技术:1.线程池 资源隔离2.信号量转载 2021-04-21 19:12:17 · 1827 阅读 · 0 评论 -
Druid,实现MySQL数据库登录密码加密
为什么要加密?现在的开发习惯,无论是公司的项目还是个人的项目,都会选择将源码上传到 Git 服务器(GitHub、Gitee 或是自建服务器),但只要将源码提交到公网服务器就会存在源码泄漏的风险,而数据库配置信息作为源码的一部分,一旦出现源码泄漏,那么数据库中的所有数据都会公之于众,其产生的不良后果无法预期。于是为了避免这种问题的产生,我们至少要对数据库的密码进行加密操作,这样即使得到了源码,也不会造成数据的泄露。如何加密?对于 Java 项目来说,要想快速实现数据库的加密,最简单可行的方案就是使用原创 2021-03-16 11:44:07 · 940 阅读 · 1 评论 -
SpringBoot+Redisson实现分布式锁
目录项目结构pom.xmlapplication.ymlRedissonPropertiesRedissonAutoConfigurationDistributedLockerRedissonDistributedLockerRedissonLockUtilRedissonLockApplicationTestController测试结果Redisson分布式锁原理项目结构pom.xml依赖<?xml version="1.0" encoding="UTF-8"?><proj原创 2021-03-04 17:35:16 · 3729 阅读 · 3 评论 -
使用Arrays.asList()、ArrayList.subList()注意事项
目录1. 使用 Arrays.asList 的注意事项1.1 修改集合相关方法异常 UnsupportedOperationException2. 使用 ArrayList 的 subList 的注意事项2.1 修改原集合的值,会影响子集合2.2 修改原集合的结构,会引起ConcurrentModificationException异常2.3 修改子集合的值,会影响原集合(非结构性修改)2.4 修改子集合的结构,会影响原集合(结构性修改)1. 使用 Arrays.asList 的注意事项1.1 修改集原创 2021-02-26 09:10:59 · 306 阅读 · 0 评论 -
多线程下保证线程安全的单例模式(双端检索)
public class SingletonDemo { private static volatile SingletonDemo instance = null; // volatile防止指令重排 public SingletonDemo() { System.out.println("我是构造SingletonDemo()。。。。"); } public static SingletonDemo getInstance() { // 双端检索 if (instanc原创 2021-02-19 23:50:15 · 347 阅读 · 0 评论 -
spring事务的相关知识点
目录1 事务的传播属性2 事务的隔离级别3 实际应用REQUIRED 传播行为REQUIRES_NEW 传播行为1 事务的传播属性所谓spring事务的传播属性,就是定义多个事务同时存在的时候,spring应该如何处理这些事务的行为。简单来讲就是: 一个开启事务的方法运行在另一个开启了事务的方法中是,当前方法是开启一个新的事物还是使用同一个事务这些属性在TransactionDefinition中定义,具体常量的解释见下:默认的事务传播属性是:Propagation.REQUIRED实际应原创 2021-02-08 23:14:50 · 213 阅读 · 0 评论 -
try-catch-finally中的坑
目录坑1:finally中使用return,覆盖返回结果坑2:finally中的代码“不生效”坑3:finally中的代码特殊情况下“不执行”在 Java 语言中 try-catch-finally 看似简单,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”。坑1:finally中使用return,覆盖返回结果若在 finally 中使用 return,那么即使 try-catch 中有 return 操作,也不会立原创 2021-02-01 11:20:41 · 259 阅读 · 0 评论 -
Java 统一封装响应结果--统一系统响应格式
第一步:定义枚举,管理响应码和相应消息package com.example.demo.responseResult;public enum ResultCode { /** * 成功:200 */ SUCCESS(200, "成功"), /** * 参数错误:1001-1999 */ PARAM_IS_INVALID(1001, "参数无效"), PARAM_IS_NULL(1002, "参数为空"), PARA原创 2021-02-01 10:13:08 · 1435 阅读 · 0 评论 -
8种保证线程安全的技术
目录1 无状态2 不可变3 安全的发布4 volatile5 synchronized6 lock7 cas8 threadlocal并发情况下如何保证数据安全,一直都是开发人员每天都要面对的问题,稍不注意就会出现数据异常,造成不可挽回的结果。笔者根据自己的实际开发经验,总结了下面几种保证数据安全的技术手段:1 无状态我们都知道只有多个线程访问公共资源的时候,才可能出现数据安全问题,那么如果我们没有公共资源,是不是就没有这个问题呢?public class NoStatusService {转载 2021-01-25 15:01:41 · 194 阅读 · 0 评论 -
单点登陆三种实现
目录前言实现方式一:父域 Cookie实现方式二:认证中心实现方式三:LocalStorage 跨域补充:域名分级本文介绍单点登录的三种实现方式:实现方式一:父域 Cookie实现方式二:认证中心实现方式三:LocalStorage 跨域补充 :域名分级前言在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID 或原创 2021-01-19 10:49:08 · 113 阅读 · 0 评论 -
Java8日期处理-工作中常用
目录Java8 日期类1. 获取今天的日期2. 获取年、月、日信息3. 处理特定日期4. 判断两个日期是否相等5. 检查像生日这种周期性事件6. 获取当前时间7. 时间运算8. 计算一周后的日期9. 计算一年前或一年后的日期10. Clock时钟类、时间戳11. 判断日期是早于还是晚于另一个日期12. Java 8中处理时区13. 某年某月共有多少天14. 检查闰年15. 计算两个日期之间的天数和月数16. 获取当前的时间戳17. 如何使用预定义的格式化工具去解析或格式化日期18. 字符串与日期类型互转H原创 2021-01-11 10:53:59 · 365 阅读 · 0 评论 -
单点登录原理
目录一、单系统登录机制1、无状态的http协议2、会话机制3、登录状态二、多系统登录机制三、单点登录2、注销四、部署图五、实现功能点一、单系统登录机制1、无状态的http协议web应用采用 browser/server 架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系。但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要转载 2020-12-31 09:33:40 · 183 阅读 · 0 评论 -
jdk1.8 HashMap知识点与常见面试点
目录1 数组2 链表3 HashMap3.1 红黑树3.2 hash碰撞3.3 HashMap的底层实现面试常见问题 1:HashMap 的数据结构? 2:HashMap 的工作原理? 3. 当两个对象的 hashCode 相同会发生什么? 4. 你知道 hash 的实现吗?为什么要这样实现?5. hash 的实现为什么要用异或运算符?6. HashMap 的 table 的容量如何确定?loadFactor 是什么? 容量如何变化?这种变化会带来什么问题?7. HashMap中put方法的过程?8.数组扩原创 2020-12-30 15:30:21 · 294 阅读 · 0 评论 -
分布式事务实现方案 及其优缺点 以及适用的场景
分布式事务事务分布式事务方案1:2PC分布式数据库的 2PC 改进模型XA 规范方案2:3PC小结 2PC 和 3PC方案3:TCCTCC 的注意点TCC 变体利用可靠消息服务实现 异步 TCCTCC 小结本地消息表事务消息Seata 的实现AT模式TCC 模式Saga 模式心得本文会介绍常见的分布式事务实现方案和其优缺点以及适用的场景,并会带出它们的一些变体实现。还会捎带一下分布式数据库对 2PC 的改进模型,看看分布式数据库是如何做的。然后再分析一波分布式事务框架Seata的具体实现,看看分布式原创 2020-12-23 15:18:08 · 1848 阅读 · 0 评论 -
springBoot 返回 yyyy-MM-dd HH:mm:ss 时间类型的json
@GetMapping("/currentDateTime")public Date currentDateTime() { return new Date();}默认情况下返回的 Date json时间格式是如果想要返回自定义的形如 “yyyy-MM-dd HH:mm:ss” 的格式需要进行以下配置spring: # 设置返回json的全局时间格式 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT原创 2020-12-20 13:07:58 · 664 阅读 · 0 评论 -
编写 if 时不带 else,提升代码可读性
If-Else通常是一个糟糕的选择,它导致设计复杂,代码可读性差,并且可能导致重构困难。1、完全不必要的Else块这也许是那些初级开发人员最负罪的之一。下面的示例很好地说明了当您被认为If-Else很棒时会发生什么。只需删除else块即可简化此过程。2、价值分配如果您要根据提供的某些输入为变量分配新值,请停止If-Else废话-一种更具可读性的方法。尽管很简单,但它却很糟糕。首先,If-Else很容易在这里被开关取代。但是,我们可以通过完全删除else来进一步简化此代码。如果不使用el转载 2020-12-09 12:29:57 · 479 阅读 · 0 评论 -
Redis 缓存穿透、缓存击穿、缓存雪崩
缓存穿透缓存穿透是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。用户拿不到数据时,就会一直发请求,查询数据库,这样会对数据库的访问造成很大的压力。如:用户查询一个 id = -1 的商品信息,一般数据库 id 值都是从 1 开始自增,很明显这条信息是不在数据库中,当没有信息返回时,会一直向数据库查询,给当前数据库的造成很大的访问压力。解决方法方法1:缓存空对象从缓存出发,如果当前MySQL数据库不存在的信息,在redi转载 2020-10-19 09:55:53 · 5106 阅读 · 2 评论 -
数据库与缓存的双写一致解决方案
为了提高数据库的效率,常采用数据库+缓存的方式;对于数据的获取都是先查询缓存,如果缓存中没有再去查数据库,将数据库查询结果返回并进行缓存;但是对于写的部分,执行顺序就会困扰许多朋友们,顺序不当会导致缓存中数据与数据库中的不一致,到底是先写缓存还是还是先写数据库表呢?您往下看:旁路缓存策略基本读取方式先来看读取方式:先读缓存,缓存中没有数据的话就去数据库读取,然后再存入缓存中,同时返回响应。这没啥好说的,看图说话:先更新数据库,后删除缓存再来看写的部分,出于本能反应,你可能会问,为什么原创 2020-10-15 12:14:18 · 538 阅读 · 0 评论 -
spring+springMVC+SpringBoot 常用注解总结
一. spring核心注解@Required此注解用于bean的setter方法上。表示此属性是必须的,必须在配置阶段注入,否则会抛出BeanInitializationExcepion。@Autowired此注解用于bean的field、setter方法以及构造方法上,显式地声明依赖。根据type来autowiring。当在field上使用此注解,并且使用属性来传递值时,Spring会自动把值赋给此field。也可以将此注解用于私有属性(不推荐),如下。@Componentpubliccl原创 2020-10-12 09:44:19 · 2193 阅读 · 1 评论