Spring Boot

@Transactional是我们在用Spring时候几乎逃不掉的一个注解,该注解主要用来声明事务。它的实现原理是通过Spring AOP在注解修饰方法的前后织入事务管理的实现语句,所以开发者只需要通过一个注解就能代替一系列繁琐的事务开始、事务关闭等重复性的编码任务。 编码方式确实简单了,但也因为隐藏了直观的实现逻辑,一些错误的编码方法可能会让@Transactional注解失效,达不到事务的作用。最直接的表现就是:方法执行过程中抛出了异常,但事务没有回滚,最终导致了脏数据的产生。 之前我在博客上也写过一篇有趣的讨论我来出个题:这个事务会不会回滚?,当时很多人都给出了标准的错误答案,如果没看过的小伙伴不妨进去挑战一下? 虽然之前讨论了一些特殊情况,但还是一直有小伙伴会邮件、微信群里问一些关于事务失效的问题。主要还是@Transactional声明事务失效的情况真的是多种多样!所以,今...

上一篇我们初次体验了Spring Authorization Server,很多粉丝都希望对这个新授权框架有进一步了解。 所以今天我们再进一步再从配置上来了解和OAuth2.0授权服务器相关的过滤器,进而对Spring Authorization Server的整个体系结构作进一步了解。还请多多点赞、转发、再看,这是对胖哥的最大鼓励。 Spring Security的模块化配置在开始之前,我们先来回顾一下上一篇中提到OAuth2.0 Client、Resource Server、Authorization Server目前已经在Spring Security体系中模块化了。 那么它们是如何做到灵活的模块化的呢? 经过对配置的分析我发现了下面的几个相同点。 这是OAuth2.0 Client的核心配置类: public final class OAuth2ClientConfigure...

11月8日Spring官方已经强烈建议使用Spring Authorization Server替换已经过时的Spring Security OAuth2.0,距离Spring Security OAuth2.0结束生命周期还有小半年的时间,是时候做出改变了。 目前Spring Authorization Server已经进入生产就绪阶段,是时候学习它了。 今天跟着胖哥的节奏搞一搞Spring Authorization Server授权服务器框架。 目前Spring Security的体系在目前的Spring Security 5.x中将OAuth2.0 Client和OAuth2.0 Resource Server进行了模块化。 Spring Security是一定要引入的。 <dependency> <groupId>org.springframe...

@Autowired注解相信每个Spring开发者都不陌生了!在DD的Spring Boot基础教程和Spring Cloud基础教程中也都经常会出现。 但是当我们使用IDEA写代码的时候,经常会发现@Autowired注解下面是有小黄线的,我们把小鼠标悬停在上面,可以看到这个如下图所示的警告信息: 那么为什么IDEA会给出Field injection is not recommended这样的警告呢? 下面带着这样的问题,一起来全面的了解下Spring中的三种注入方式以及他们之间在各方面的优劣。 Spring中的三种依赖注入方式Field Injection@Autowired注解的一大使用场景就是Field Injection。 具体形式如下: @Controllerpublic class UserController { @Autowired pri...

项目场景:ClickHouse 操作基于 Mybatis-puls源码扩展开发。解决ClickHouse的修改和删除 SQL操作与Mysql不相同。 基于 Mybatis-puls:update 、updateById 、 delete 函数 1、SqlMethodDiv.java 文件枚举类,对sql脚本定义 package com.demo.infrastructure.injector.enums; /** * @author liuxiansong */public enum SqlMethodDiv { /** * 删除 */ DELETE_BY_ID("deleteByIdClickHouse", "根据ID 删除一条数据", "<script>\nALTER TABLE %s DELETE WHERE %s=# ...

最近有个粉丝提了个问题,说他在Spring Security中用JWT做退出登录的时无法获取当前用户,导致无法证明“我就是要退出的那个我”,业务失败!经过我一番排查找到了原因,而且这个错误包括我自己的大部分人都犯过。 Session会话之所以要说Session会话,是因为Spring Security默认配置就是有会话的,所以当你登录以后Session就会由服务端保持直到你退出登录。只要Session保持住,你的请求只要进入服务器就可以从ServletRequest中获取到当前的HttpSession,然后会根据HttpSession来加载当前的SecurityContext。相关的逻辑在Spring Security默认的过滤器SecurityContextPersistenceFilter中,有兴趣可以看相关的源码。 而且默认情况下SecurityContextPersisten...

在Spring Boot项目中,可以通过@EnableScheduling注解和@Scheduled注解实现定时任务(在DD的Spring Boot教程中就有介绍:使用@Scheduled实现定时任务),也可以通过SchedulingConfigurer接口来实现定时任务。但是这两种方式不能动态添加、删除、启动、停止任务。 下面是DD在简书上看到的一篇非常不错的文章,作者jessehua,通过扩展Spring自带的定时任务,实现了定时任务的动态增删启停。如果你也有这样的需求,那么可以看看下面的内容,学习一下作者的思路。 要实现动态增删启停定时任务功能,比较广泛的做法是集成Quartz框架。但是本人的开发原则是:在满足项目需求的情况下,尽量少的依赖其它框架,避免项目过于臃肿和复杂。 查看spring-context这个jar包中org.springframework.scheduli...

最近几年的项目我都用JWT作为身份验证令牌。我一直有一个疑问:服务端发放给浏览器的JWT到底应该存储在哪里?这里只讨论浏览器的场景,在这个场景里有三种选择。 Cookie服务端可以将JWT令牌通过Cookie发给浏览器,浏览器在请求服务端接口时会自动在Cookie头中带上JWT令牌,服务端对Cookie头中的JWT令牌进行检验即可实现身份验证。但它容易受到CSRF攻击的影响。 解决的方法是通过设置Cookie的SameSite属性为Strict。跨站时不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。 Cookie除了易受CSRF攻击还有XSS攻击。黑客可以通过JS脚本读取Cookie中的信息。为了防止这一点,可以设置Cookie的属性为HttpOnly。 response.setHeader("Set-Cookie", "jwt=jwt...

在如今的关系型数据库中,有两个开源产品是你必须知道的。其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的。而今天我们将介绍另外一个开源关系型数据库:PostgreSQL,以及在Spring Boot中如何使用。 PostgreSQL简介在学习PostgreSQL的时候,我们总是会将其与MySQL放一起来比较:MySQL自称是最流行的开源数据库,而PostgreSQL则标榜自己是最先进的开源数据库,那么有多先进呢?下面就一起认识一下它! PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。Postg...

9 月 23 日官方发布了 Spring Boot 2.5.5 版本,此版本包括 41 个错误修复、文档改进和依赖项升级。 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> <!-- lookup parent from repository --></parent> 缺陷修复 修复 端点默认情况下不会清理 SPRING_APPLICATION_JSON #28081 Flyway 和 Spring Integratio...

Spring Boot的上传文件,相信你一定会了。如果还不会的小伙伴,可以先看看之前的分享: Spring Boot 2.x基础教程:实现文件上传 Spring Boot 2.x基础教程:多文件的上传 文件上传实现之后,通常最常见的另外两个操作就是下载和预览,下载只需要知道地址,就简单搞定了,那么预览怎么做?你知道吗? 今天小编就来推荐一个用Spring Boot搭建的文档在线预览解决方案:kkFileView! 这是一款成熟且开源的文件文档在线预览项目解决方案,如果你用过类似如永中office、office365、idocv这些付钱产品,你一定会喜欢kkFileView,因为在功能满足的前提下,谁还喜欢付费呢? 12大特性 支持word excel ppt,pdf等办公文档 支持txt,java,php,py,md,js,css等所有纯文本 支持zip,rar,jar,tar,...

通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务、为异步任务配置线程池、使用多个线程池隔离不同的异步任务。今天这篇,我们继续对上面的知识进行完善和优化! 如果你已经看过上面几篇内容并已经掌握之后,一起来思考下面这个问题: 假设,线程池配置为核心线程数2、最大线程数2、缓冲队列长度2。此时,有5个异步任务同时开始,会发生什么? 场景重现我们先来把上面的假设用代码实现一下: 第一步:创建Spring Boot应用,根据上面的假设写好线程池配置。 @EnableAsync@SpringBootApplicationpublic class Chapter78Application { public static void main(String[] args) { SpringApplicatio...

通过上一篇:配置@Async异步任务的线程池的介绍,你应该已经了解到异步任务的执行背后有一个线程池来管理执行任务。为了控制异步任务的并发不影响到应用的正常运作,我们必须要对线程池做好相应的配置,防止资源的过渡使用。除了默认线程池的配置之外,还有一类场景,也是很常见的,那就是多任务情况下的线程池隔离。 什么是线程池的隔离,为什么要隔离可能有的小伙伴还不太了解什么是线程池的隔离,为什么要隔离?。所以,我们先来看看下面的场景案例: @RestControllerpublic class HelloController { @Autowired private AsyncTasks asyncTasks; @GetMapping("/api-1") public String taskOne() { Completab...

上一篇我们介绍了如何使用@Async注解来创建异步任务,我可以用这种方法来实现一些并发操作,以加速任务的执行效率。但是,如果只是如前文那样直接简单的创建来使用,可能还是会碰到一些问题。存在有什么问题呢?先来思考下,下面的这个接口,通过异步任务加速执行的实现,是否存在问题或风险呢? @RestControllerpublic class HelloController { @Autowired private AsyncTasks asyncTasks; @GetMapping("/hello") public String hello() { // 将可以并行的处理逻辑,拆分成三个异步任务同时执行 CompletableFuture<String> task1 = asyncTasks...

什么是“异步调用”?“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。 同步调用下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内) @Slf4j@Componentpublic class AsyncTasks { public static Random random = new Random(); public void doTaskOne() throws Exception { log.info("开始做任务一"); long start = System.currentTimeMil...