这篇文章主要讲解TransactionalEventListener是怎样工作的?适合在什么场景,能解决哪些问题?以及和EventListener不同之处。
示例
这里举个业务场景,假如我们有个需求,用户创建成功后给用户发送一个邮件。这里有两个事情要做:
- 创建用户
- 给用户发送邮件
Redis 6.0.0稳定版(GA)终于发布了。这个版本提供了很多令人振奋的新特性和功能改进,比如新的网络协议RESP3、新的集群代理、ACL等,其中最受关注的应该是 多线程,带着诸多疑问,让我们一起开始《Redis 6.0新特性》。
Redis在处理客户端请求时,包括 获取(socket读)、解析、执行、内容返回(socket写),都是由一个顺序的串行主线程来处理的,这就是所谓的 单线程。但如果严格来说,从Redis 4.0开始就不是单线程了,除了主线程外,它还有后台线程,这些线程在处理一些比较慢的操作,比如清理脏数据、释放无用连接、删除大量keys等。
在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。
守护线程,是指程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
将线程转换为守护线程可以通过调用Thread对象的**setDaemon(true)**方法来实现。在使用守护线程时需要注意以下几点:
thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
在Daemon线程中产生的新线程也是Daemon的。
守护线程应该永远不要去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。
Java 8中引入了新的Date-Time
API,解决了旧的日期时间API的以下缺点:
java.util.Date
是线程不安全的,而 新的 Date-Time API
是不可变的且没有提供setter方法Java 8在java.time
包下引入了新的Date-Time API,其中最重要的类是:
在介绍Spring整合Mybatis原理之前,我们得先来稍微介绍Mybatis的工作原理。
在Mybatis中,我们可以使用一个接口去定义要执行sql,简化代码如下:
定义一个接口,@Select
表示要执行查询sql语句。
1 | public interface UserMapper { |
以下为执行sql代码:
1 | InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); |
Stream(流)是一个来自数据源的元素队列并支持聚合操作
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
在Java 8之前,接口只能定义抽象方法。这些方法的实现必须在单独的类中提供。因此,如果要在接口中添加新方法,则必须在实现接口的类中提供其实现代码。为了克服此问题,Java 8引入了默认方法的概念,允许接口定义具有实现体的方法,而不会影响实现接口的类。
1 | // A simple program to Test Interface default |