- 博客(304)
- 资源 (20)
- 收藏
- 关注
原创 Spring MVC 中文文档
Spring Web MVC是建立在Servlet API上的原始Web框架,从一开始就包含在Spring框架中。正式名称 “Spring Web MVC” 来自其源模块的名称( ),但它更常被称为 “Spring MVC”。与Spring Web MVC并行,Spring Framework 5.0引入了一个 reactive 技术栈的 Web框架,其名称 “Spring WebFlux” 也是基于其源模块( )。本章介绍了Spring Web MVC。下一章 将介绍Spring WebFlux。关于基线
2023-10-27 13:23:47
318
原创 10 | Flow,是异步编程的终极选择吗
好,到这里,我来做个小结。前面,我们讨论了指令式编程模型和声明式编程模型,回调函数以及回调地狱,以及 Java 反应式编程模型的基本组件。限于篇幅,我们不能展开讨论 Java 反应式编程模型的各种潜力和变化,比如“反应式宣言”“背压”这样的热门词汇。我建议你继续深入地了解反应式编程的这些要求(比如反应式宣言和反应式系统),以及成熟的明星产品(比如 Akka 和 Spring 5+)。由于 Java 的协程模式还没有发布,我对反应式编程的未来还没有清晰的判断。
2023-10-25 13:52:51
57
原创 09 | 异常恢复,付出的代价能不能少一点
好,到这里,我来做个小结。刚才,我们了解和讨论了 Java 异常处理的两个概念:可恢复异常和不可恢复异常。我还给出了在使用错误码的场景下,快速定位问题的替代方案。这一讲我们并没有讨论新特性,而是我们重点讨论了现在 Java 异常处理机制的几个热门话题。这节课的重点,是要开拓我们的思维。了解这些热门的话题,不仅可以增加你的谈资,还可以切实地提高你的代码性能和可维护性。另外,我还拎出了几个今天讨论过的技术要点,这些都可能在你的面试中出现哦。了解可恢复异常和不可恢复异常这两个概念,以及它们的使用场景;
2023-10-25 13:48:52
55
原创 08 | 抛出异常,是不是错误处理的第一选择
好,这节课就讲到这里,我来做个小结。从前面的讨论中,我们了解了 Java 异常处理带来的性能问题,我还给你展示了使用错误码的方式进行错误处理的方案。使用错误码的方式进行错误处理,错误码不能携带调试信息,这提高了错误处理的性能,但是增加了错误排查的困难,降低了代码的可维护性。我们在代码里,是应该使用错误码,还是应该使用异常,这是一个需要根据应用场景认真权衡的问题。Java 的新特性,尤其是封闭类和档案类,为我们在 Java 的软件里使用错误码的形式,提供了强大的支持,让我们有了新的选择。
2023-10-25 13:45:36
52
原创 07 | switch匹配:能不能适配不同的类型
好,到这里,我来做个小结。从前面的讨论中,我们重点了解了 switch 的模式匹配,以及如何使用 switch 表达式来检测子类扩充出现的兼容性问题。具有模式匹配能力的 switch,提升了 switch 的数据类型匹配能力。switch 要匹配的数据,现在可以是整形的原始类型(数字、枚举、字符串),或者引用类型。在前面的讨论里,我们把重点放在了 switch 表达式上。实际上,除了情景穷举相关的内容之外,我们的讨论也适用于 switch 语句。
2023-10-24 09:38:30
49
原创 06 | switch表达式:怎么简化多情景操作
好,到这里,我来做个小结。从前面的讨论中,我们重点了解了 switch 表达式和改进的 switch 语句。我们还讨论了 switch 表达式带来的新概念和新的关键字,了解了这些基本概念以及它们的适用范围。新的 switch 形式、语句和表达式,不同的使用范围,这些概念交织在一起,让 switch 的学习和使用都变成了一件有点挑战性的事情。箭头标识符的引入,简化了代码,提高了编码效率。可是,学习这么多种 switch 的表现形式,也增加了我们的学习负担。
2023-10-24 09:33:00
46
原创 05 | 类型匹配:怎么切除臃肿的强制转换
Java 的模式匹配是一个新型的、而且还在持续快速演进的领域。类型匹配是模式匹配的一个规范。类型匹配这个特性,首先在 JDK 14 中以预览版的形式发布。在 JDK 15 中,改进的类型匹配再次以预览版的形式发布。最后,类型匹配在 JDK 16 正式发布。那么,什么是模式匹配,什么又是类型匹配呢?这就要说到模式的组成。通常,一个模式是匹配谓词和匹配变量的组合。其中,匹配谓词用来确定模式和目标是否匹配。在模式和目标匹配的情况下,匹配变量是从匹配目标里提取出来的一个或者多个变量。
2023-10-24 09:25:17
37
原创 04 | 封闭类:怎么刹住失控的扩展性
封闭类这个特性,首先在 JDK 15 中以预览版的形式发布。在 JDK 16 中,改进的封闭类再次以预览版的形式发布。最后,封闭类在 JDK 17 正式发布。那么,什么是封闭类呢?封闭类的英文,使用的词汇是"sealed classes"。从名字我们就可以感受到,封闭类首先是 Java 的类,然后它还是封闭的。Java 的类,我们都知道什么意思。那么,“封闭”又是什么意思呢?字面的意思,就是把一些东西封存起来,里面的东西出不去,外面的东西也进不来,所以可查可数。
2023-10-24 08:49:26
23
原创 03 | 档案类:怎么精简地表达不可变数据
档案类这个特性,首先在 JDK 14 中以的形式发布。在 JDK 15 中,改进的档案类再次以的形式发布。最后,档案类在 JDK 16。那么,什么是档案类呢?档案类的英文,使用的词汇是“record”。官方的说法,Java 档案类是用来表示不可变数据的透明载体。这样的表述,有两个关键词,一个是不可变的数据,另一个是透明的载体。该怎么理解“不可变的数据”和“透明的载体”呢?我们还是通过案例和代码,一步一步地来拆解、理解这些概念。
2023-10-24 08:44:47
22
原创 02 | 文字块:怎么编写所见即所得的字符串
首先,我们从整体上来理解一下文字块的编译期处理这种方式。阅读一下下面的代码,你能不能预测一下下面这两个问题的结果?使用传统方式声明的字符串和使用文字块声明的字符串的内容是一样的吗?这两个字符串变量指向的是同一个对象,还是不同的对象?
2023-10-24 08:38:58
23
原创 01 | JShell:怎么快速验证简单的小问题
JShell 这个特性,是在 JDK 9 正式发布的。从名字我们就能想到,JShell 是 Java 的脚本语言。一门编程语言,为什么还需要支持脚本语言呢?编程语言的脚本语言,会是什么样子的?它又能够给我们带来什么帮助呢?让我们一起来一层一层地拆解这些问题,弄清楚 Java 语言的脚本工具是怎么帮助我们提高生产效率的。我们先从阅读案例开始。
2023-10-24 08:32:47
24
原创 20 | Spring Data JPA 中文文档
Spring Data JPA 为 Jakarta Persistence API(JPA)提供 repository 支持。它简化了需要访问JPA数据源的应用程序的开发。关于如何从Spring Data的早期版本升级的说明在项目 wiki上提供。按照 发布说明部分 的链接,找到你要升级的版本。升级说明总是在发行说明中的第一项。如果你落后一个以上的版本,请确保你也查看你跳过的版本的发行说明。由于各个Spring Data模块的起始日期不同,它们中的大多数都有不同的主要和次要版本号。找到兼容的模块最简单的方法
2023-10-19 09:05:30
456
原创 19 | 如何搞清楚事务、连接池的关系?正确配置是怎样的
第一步:新建一个 TransactionHelper 类,进行事务管理,代码如下。复制代码/*** 利用spring进行管理*/@Component/*** 利用spring 的机制和jdk8的function机制实现事务*/@Transactional(rollbackFor = Exception.class) //可以根据实际业务情况,指定明确的回滚异常第二步:直接在 service 中就可以使用了,代码如下。复制代码@Autowired==/**
2023-10-15 20:40:27
452
原创 18 | 生产环境多数据源的处理方法有哪些
我们都知道 DataSource 的本质是获得数据库连接,而 AbstractRoutingDataSource 帮我们实现了动态获得数据源的可能性。下面还是通过一个例子看一下它是怎么使用的。第一步:定一个数据源的枚举类,用来标示数据源有哪些。复制代码/*** 定义一个数据源的枚举类*/DB1, //实际工作中枚举的语义可以更加明确一点;DB2;return e;return db1;//没找到的情况下,默认返回数据源1。
2023-10-15 20:38:24
64
原创 17 | DataSource 为何物?加载过程是怎样的
在实际工作中,由于 HikariCP 和 Druid 各有千秋,国内的很多开发者都使用 AliDruid 作为数据源,我们看看都是怎么配置的,每一步都很简单。第一步:引入 Gradle 依赖。复制代码第二步:配置数据源。复制代码spring.datasource.druid.url= # 或spring.datasource.url=spring.datasource.druid.username= # 或spring.datasource.username=
2023-10-15 20:37:16
130
原创 16 | 如何自定义 HandlerMethodArgumentResolvers
在实际的工作中,你可能会遇到对老项目进行改版的工作,如果要我们把旧的 API 接口改造成 JPA 的技术实现,那么可能会出现需要新、老参数的问题。假设在实际场景中,我们 Page 的参数是 page[number],而 page size 的参数是 page[size],看看应该怎么做。第一步:新建 MyPageableHandlerMethodArgumentResolver。用来兼容?page[size]=2&page[number]=0 的参数情况;支持 JPA 新的参数形式?
2023-10-15 20:35:58
61
原创 15 | JPA 对 Web MVC 开发者做了哪些支持
正常情况下,我们开启 Spring Data 对 Spring Web MVC 支持的时候需要在 @Configuration 的配置文件里面添加 @EnableSpringDataWebSupport 这一注解,如下面这种形式:复制代码由于我们用了 Spring Boot,其有自动加载机制,会自动加载 SpringDataWebAutoConfiguration 类,发生如下变化:复制代码。
2023-10-15 20:34:20
361
原创 14 | 乐观锁机制和重试机制在实战中应该怎么用
乐观锁在实际开发过程中很常用,它没有加锁、没有阻塞,在多线程环境以及高并发的情况下 CPU 的利用率是最高的,吞吐量也是最大的。而 Java Persistence API 协议也对乐观锁的操作做了规定:通过指定 @Version 字段对数据增加版本号控制,进而在更新的时候判断版本号是否有变化。如果没有变化就直接更新;如果有变化,就会更新失败并抛出“OptimisticLockException”异常。我们用 SQL 表示一下乐观锁的做法,代码如下:复制代码。
2023-10-15 20:32:50
96
原创 13 | 如何正确使用 @Entity 里面的回调方法
复制代码@Log4j2如果注释了,测试用例这个地方的验证也需要去掉@PreUpdate如果注释了,测试用例这个地方的验证也需要去掉@PreRemove@PostLoad//查询方法里面可以对一些敏感信息做一些日志我们上面注释的代码,也可以改变 entity 里面的值,但是在这个 Listener 的里面我们不做修改,所以把 setVersion 和 setCreateUserId 注释掉了,要注意测试用例里面这两处也需要修改。
2023-10-15 20:31:41
81
原创 12 | JPA 的审计功能解决了哪些问题
Auditing 是帮我们做审计用的,当我们操作一条记录的时候,需要知道这是谁创建的、什么时间创建的、最后修改人是谁、最后修改时间是什么时候,甚至需要修改记录……1.可以很容易地让我们写自己的 BaseEntity,把一些公共的字段放在里面,不需要我们关心太多和业务无关的字段,更容易让我们公司的表更加统一和规范,就是统一加上 @CreatedBy、@CreatedDate、@LastModifiedBy、@LastModifiedDate 等。而其他都不变,我们再跑一次刚才的测试用例,发现效果是一样的。
2023-10-15 20:30:19
86
原创 11 | JpaRepository 如何自定义
Java Persistence API 规定,操作数据库实体必须要通过 EntityManager 进行,而我们前面看到了所有的 Repository 在 JPA 里面的实现类是 SimpleJpaRepository,它在真正操作实体的时候都是调用 EntityManager 里面的方法。
2023-10-15 20:28:48
320
原创 10 | JpaSpecificationExecutor 实现的原理是什么
我们可以自定义一个Specification 的实现类,它可以实现任何实体的动态查询和各种条件的组合。复制代码/*** 实现实体根据不同的字段、不同的Operator组合成不同的Predicate条件*/@Override} else {我们通过 `` 泛型,解决不同实体的动态查询(当然了,我只是举个例子,这个方法可以进行无限扩展)。我们通过 SearchCriteria 可以知道不同的字段是什么、值是什么、如何操作的,看一下代码:复制代码/**
2023-10-15 20:27:09
40
原创 09 | JpaSpecificationExecutor 解决了哪些问题
那么我们再看一下参数 ExampleSpecification 的源码,发现它是接口 Specification 的实现类,并且是非公开的实现类,可以通过接口对外暴露 and、or、not、where 等组合条件的查询条件。我们通过查看 JpaSpecificationExecutor 的 Structure 图会发现,方法就有这么几个,细心的同学这个时候会发现它的参数 Specification,正是我们分析 QueryByExampleExecutor 的原理时候使用的 Specification。
2023-10-15 20:25:27
45
原创 08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?
我们用 Spring Boot 里面默认集成的 fasterxml.jackson 加以说明,这看似和 JPA 没什么关系,但是一旦我们和 @Entity 一起使用的时候,就会遇到一些问题,特别是新手同学,我们这一课时详细介绍一下用法。先来跟着我了解一下 Jackson 的基本语法。
2023-10-13 18:51:01
248
原创 07 | @Entity 之间的关联关系注解如何正确使用?
实体与实体之间的关联关系一共分为四种,分别为 OneToOne、OneToMany、ManyToOne 和 ManyToMany;而实体之间的关联关系又分为双向的和单向的。实体之间的关联关系是在 JPA 使用中最容易发生问题的地方,接下来我将一一揭晓并解释。我们先看一下 OneToOne,即一对一的关联关系。
2023-10-13 18:50:06
651
原创 06 | @Entity 里面的 JPA 注解有哪些?在 Java 多态场景下如何使用?
前几课时我为你介绍了 Repository 的用法,其中我经常会提到“实体类”(即我们前面的 User 类),它是对我们数据库中表的 Metadata 映射,那么具体如何映射呢?这一课时我们来讲解。我们先看一下 Java Persistence API 里面都有哪些重要规定;再通过讲解基本注解,重点介绍一下联合主键和实体之间的继承关系,然后你就会知道 JPA 的实体里面常见的注解有哪些。话不多说,看一下 Entity 的相关规定。
2023-10-13 18:49:00
1193
原创 05 | @Query 解决了什么问题?什么时候应该选择它?
上面我介绍了 @Query 的基本用法,下面介绍一下 @Query 在我们的实际应用中最受欢迎的两处场景。
2023-10-13 18:47:42
565
原创 04 | 如何利用 Repository 中的方法返回值解决实际问题?
官方给我们提供了自定义 Streamable 的方法,不过在实际工作中很少出现要自定义保证结果类的情况,在这里我简单介绍一下方法,看如下例子:复制代码(4)以上四个步骤介绍了自定义 Streamable 的方法,分别为:(1)Product 实体,公开 API 以访问产品价格。(2)Streamable`` 的包装类型可以通过 Products.of(…) 构造(通过 Lombok 注解创建的工厂方法)。(3)包装器类型在 Streamable`` 上公开了计算新值的其他 API。
2023-10-13 18:46:12
120
原创 03 | Defining Query Methods 的命名语法与参数
若想要实现 CRUD 的操作,常规做法是写一大堆 SQL 语句。但在 JPA 里面,只需要继承 Spring Data Common 里面的任意 Repository 接口或者子接口,然后直接通过方法名就可以实现,神不神奇?来看下面具体的使用步骤。第 1 步,User 实体的 UserRepository 继承 Spring Data Common 里面的 Repository 接口:复制代码第 2 步,对于 Service 层就可以直接使用 UserRepository 接口:复制代码。
2023-10-13 18:44:53
116
原创 02 | Spring Data Common 之 Repository 如何全面掌握?
本课时到这里就结束了,这一课时我讲解了 Repository 接口、CrudRepository 接口、PagingAndSortingRepository 接口、JpaRepository 接口的用法,通过源码我们知道了接口里面的方法有哪些、怎么实现的,也知道了 Spring 的动态代理机制是怎么运用到 UserRepository 接口的。
2023-10-13 18:43:33
112
原创 01 | Spring Data JPA 初识
JPA 是 JDK 5.0 新增的协议,通过相关持久层注解(@Entity 里面的各种注解)来描述对象和关系型数据里面的表映射关系,并将 Java 项目运行期的实体对象,通过一种Session持久化到数据库中。想象一下,一旦协议有了,大家都遵守了此种协议进行开发,那么周边开源产品就会大量出现,比如我们在后面要介绍的第 29 课时(Spring Data Rest 是什么?和 JPA 是什么关系?
2023-10-13 18:40:17
122
原创 【企业架构】企业架构师vs解决方案架构师vs领域架构师
企业架构被认为是通过信息技术获取竞争优势的关键途径之一。降低成本、增加灵活性和规范技术环境的需求越来越大。企业架构在概念上可以划分为不同的架构层,包括业务架构和IT架构(数据、应用程序和技术架构)。然后,解决方案体系结构接受一个问题,并提出构建块来解决它。它经常重用企业架构提供的其他元素(企业构建块、企业功能、架构标准和指导方针)因此,企业架构师在企业架构团队和组织的其他地方有许多不同的角色和职责。
2023-02-06 23:01:20
322
原创 XDocReport使用入门
XDocReport是GitHub上根据麻省理工学院许可证开源的Wrod导出框架。XDocReport可以根据ODT、Doc、Docx文档模板通过模板引擎语法(Freemarker、Velocity)转换为另外一种格式文档(Doc、Docx、XHTML、PDF)。
2022-12-24 17:16:29
5295
1
原创 OAuth 2.0设计规范
OAuth2.0接口设计规范说明OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务器提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
2022-05-20 15:26:55
1142
1
jarslink-demo
2018-04-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人