
Spring Boot2.x实战全集
文章平均质量分 91
讲解Spring Boot 2.2 +方方面面的实战知识。
汪云飞记录本
Spring
展开
-
新书推荐《从企业级开发到云原生微服务:Spring Boot 实战》
我的新书《从企业级开发到云原生微服务:Spring Boot 实战》即将出版,内容涵盖了丰富Spring Boot开发的相关知识,主要包含目录有:第一章 初识Spring Boot(快速领略Spring Boot的美丽)第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)第三章 函数式编程第四章 Spring 5.x基...原创 2019-08-22 17:08:22 · 1420 阅读 · 5 评论 -
Spring Boot实战工具3 - Lombok
Lombok可以通过简单的注解代替大量的模板代码,极大的提高了我们的编码效率。3.1 开启Lombok支持我们在IntelliJ IDEA下使用Lombok需要进行如下几步:IntelliJ IDEA 安装Lombok插件进入插件安装界面Windows:File->Settings->pluginsmacOS:IntelliJ IDEA->Preferences->plugins搜索Lombok插件安装安装完成后重启IntelliJ IDEA原创 2020-05-14 17:39:16 · 426 阅读 · 0 评论 -
Spring Security学习路径(含认证、授权、OAuth2.0与Reactive Spring Security)
基础Spring Boot 2.x实战77 - Spring Security 1 - Spring Boot下的Spring Security(自动配置)与Web安全配置Spring Boot 2.x实战78 - Spring Security 2 - Spring Security的认证(Authentication)Spring Boot 2.x实战79 - Spring Security 3 - Spring Security的授权(Authorization)之Web路径安全Spring原创 2020-08-10 13:42:52 · 2819 阅读 · 0 评论 -
Spring Boot 2.x实战39 - Spring Web MVC 11 - Web MVC配置(HttpMessageConverter)
3.5 HttpMessageConverter在Spring MVC中请求(@RequestBody、RequestEntity等)和返回(@Responsebody、ResponseEntity等)都是通过HttpMessageConverter来实现数据转换的。外部的请求数据通过HttpMessageConverter转换成Java对象,而Java对象又通过HttpMessageConverter转换成外部数据到返回中。在我们前面的例子中,web请求体中的Json数据通过MappingJackso原创 2020-05-12 17:37:44 · 507 阅读 · 0 评论 -
Spring Boot 2.x实战40 - Spring Web MVC 12 - Web MVC配置(控制器方法参数和返回值处理设置-使用HandlerMethodArgumentResolver)
3.6 方法参数和返回值处理设置在控制器方法里,我们可以使用@RequestBody、RequestEntity获得请求体里的数据,使用@ResponseBody、ResponseEntity对返回体进行处理。在Spring MVC中可以通过实现HandlerMethodArgumentResolver接口来实现对控制器方法参数进行处理,通过实现HandlerMethodReturnValueHandler可以对方法的返回值进行处理。若同时需要对请求参数和返回返回体进行处理的话,则继承Abstract原创 2020-05-13 13:35:39 · 309 阅读 · 0 评论 -
Spring Boot 2.x实战41-SpringWebMVC13-WebMVC配置(控制器方法参数和返回值处理设置-AbstractMessageConverterMethodProcessor)
3.6.2 示例2我们再模仿@RequestBody和@ResponseBody的实现原理做一个简单的示例。请求体注解:@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RequestPerson {}返回体注解:@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@D原创 2020-05-14 13:56:58 · 1584 阅读 · 0 评论 -
Spring Boot 2.x实战42 - Spring Web MVC 14 - Web MVC配置(初始化数据绑定设置-ConfigurableWebBindingInitializer)
3.7 初始化数据绑定设置Spring MVC可以让我们配置ConfigurableWebBindingInitializer 的Bean来初始化WebDataBinder对象,这也意味着前面对于PropertyEditor、Formatter和Validator可以用现在这种方式来设置。初始化数据绑定是在控制器方法参数处理之前进行的。注册PropertyEditor:@BeanConfigurableWebBindingInitializer ConfigurableWebBindingIniti原创 2020-05-14 14:04:46 · 310 阅读 · 0 评论 -
Spring Boot 2.x实战43 - Spring Web MVC 15 - Web MVC配置(类型转换原理与设置-Converter和ConverterFactory)
3.8 类型转换原理与设置Spring为我们提供了ConversionService接口用来做类型转换,它是Spring类型转换系统的入口。像我们注册的Formatter的FormattingConversionService类就是它的实现类。FormattingConversionService支持注册Formatter、Converter和AnnotationFormatterFactory,它属于配置初始化数据绑定的一部分。3.8.1 FormatterFormatter用于格式化(id|na原创 2020-05-14 14:15:30 · 704 阅读 · 0 评论 -
Spring Boot 2.x实战44 - Spring Web MVC 16 - Web MVC配置(类型转换原理与设置-AnnotationFormatterFactory)
3.8.3 AnnotationFormatterFactory AnnotationFormatterFactory创建Formatter来格式化标记了特殊注解的属性值。NumberFormatAnnotationFormatterFactory使用@NumberFormat注解创建NumberStyleFormatter、CurrencyStyleFormatter,PercentStyleFormatter这些Formatter来格式化注解的属性。DateTimeFormatAnnotati原创 2020-05-14 14:27:01 · 389 阅读 · 0 评论 -
Spring Boot 2.x实战45 - Spring Web MVC 17 - Web MVC配置(路径匹配和内容协商-PathMatchConfigurer)
3.9 路径匹配和内容协商Spring MVC中可以通过重载WebMvcConfigurer接口的configurePathMatch方法来设置路径匹配。Spring MVC为我们提供了PathMatchConfigurer来进行路径匹配配置。 public void configurePathMatch(PathMatchConfigurer configurer) { }3.9.1 后缀匹配使用PathMatchConfigurer.setUseSuffixPatternMatc原创 2020-05-14 15:00:05 · 3135 阅读 · 0 评论 -
Spring Boot 2.x实战46 - Spring Web MVC 18 - Web MVC配置(JSON配置)
3.10 JSONSpring MVC给我们提供了多种Json的实现,包含:Jackson、Gson、JSON-B。Jackson使用的是MappingJackson2HttpMessageConverter,Spring Boot提供的自动配置为:JacksonAutoConfigurationGson使用的是GsonHttpMessageConverter,Spring Boot提供的自动配置为:GsonAutoConfigurationJSON-B使用的是JsonbHttpMess原创 2020-05-14 15:03:40 · 279 阅读 · 0 评论 -
Spring Boot 2.x实战47 - Spring Web MVC 19 - Web MVC配置(常用外部配置:静态文件目录,欢迎页,Favicon)
3.11 其他外部属性配置3.11.1 静态文件目录Web开发中有很多静态的文件,如:html、js、css、图片等。在Spring Boot下,下列目录都可放置静态文件:classpath:/META-INF/resources/classpath:/resources/classpath:/static/classpath:/public/当前的classpath类路径是Spring Boot为我们生成的src/main/resources目录。我们还可以通过spring.resour原创 2020-05-14 15:17:10 · 259 阅读 · 0 评论 -
Spring Boot 2.x实战48 - Spring Web MVC 20 - Servlet容器(如何注册Servlet、Filter和listener)
4. Servlet容器Spring Boot使用的是内嵌式的Servlet容器,支持tomcat、jetty和undertow。4.1 注册Servlet、Filter和listenerSpring Boot下我们可以用多种形式注册Servlet、Filter和Listener,我们先定义三个简单的示例:Servlet:@Slf4j@Getter@Setterpublic class CustomServlet extends HttpServlet { private Strin原创 2020-05-14 15:28:53 · 259 阅读 · 0 评论 -
Spring Boot 2.x实战49 - Spring Web MVC 21 - Servlet容器(配置Servlet容器-常用配置)
4.2 配置Servlet容器4.2.1 外部配置网络配置:server.port、server.address等;用户会话配置:server.servlet.session.*;错误配置:server.error.*;HTTP压缩:server.compression.* ,支持html、xml、css、js、json、text。默认关闭,可用server.compression.enabled: true开启;SSL配置:server.ssl.*;tomcat专有配置:server.to原创 2020-05-14 15:34:28 · 205 阅读 · 0 评论 -
Spring Boot 2.x实战50 - Spring Web MVC 22 - Servlet容器(配置SSL与HTTP/2)
4.2.5 配置SSLSSL全称为Secure Sockets Layer,它是建立web服务器和客户端(浏览器)之间安全连接的标准安全技术。它保证了web服务器和客户端之间传递数据保持私有和完整。为了创建SSL连接,web服务器需要一个SSL证书。一般情况下,我们会购买证书,本例我们会通过java的工具keytool生成一个证书。生成证书:$ keytool -genkey -keyalg RSA -alias wisely -keystore keystore.jks -storepass原创 2020-05-14 15:46:10 · 374 阅读 · 0 评论 -
Spring Boot 2.x实战51 - Spring Web MVC 23 - 异步请求(Servlet 3.0 异步返回-Callable)
5. 异步请求当一个web请求到达了Servlet容器时,Servlet线程将被阻碍直至处理执行完成。这种阻碍称为同步,我们需要通过一些方式来降低Servlet容器的负载。5.1 Servlet 3.0 异步返回Spring MVC支持Servlet 3.0提供的异步支持,它将web请求的处理放在另外一个线程中。我们由另外的线程来处理耗时的任务,而让Servlet线程被释放去处理另外的web请求,而不是阻碍Servlet线程。此时的返回(response)还是打开的,当处理完成后,将处理结果返回给客户原创 2021-03-04 10:26:22 · 847 阅读 · 0 评论 -
Spring Boot 2.x实战52 - Spring Web MVC 24 - 异步请求(Servlet 3.0 异步返回-DeferredResult)
DeferredResult的结果是由另外一个线程再稍后计算后返回给客户端的。DeferredResult的线程执行器可由CompletableFuture来定制。同样我们在TaskService定义我们的处理:@Service@Slf4jpublic class TaskService { public String deferredTask() { log.info("+++++DeferredResult数据返回+++++"); return "resu原创 2020-05-19 15:53:26 · 474 阅读 · 0 评论 -
Spring Boot 2.x实战53 - Spring Web MVC 25 - 异步请求(HTTP Streaming - ResponseBodyEmitter)
5.2 HTTP StreamingDeferredResult和Callable只能异步返回单个值;如果我们想有多个异步返回的话,我们可以用HTTP Streaming来实现。HTTP Streaming是一种推送形式的数据传输技术,它通过无限期开放的HTTP连接让web服务器(tomcat)能持续向客户端(浏览器)传送数据。在HTTP Streaming下,web服务器会握住客户端的请求并让返回保持开放,这样服务器可以通过返回一直发送数据。这个请求-返回的通道会一直开启,除非我们显示的要求关闭。原创 2020-05-19 15:58:30 · 1865 阅读 · 0 评论 -
Spring Boot 2.x实战54 - Spring Web MVC 26 - 异步请求(HTTP Streaming - SSE)
Spring MVC提供了SseEmitter用来提供对W3C的SSE规范的支持。SSE是Server-Sent Events的缩写。HTML5 API 提供了EventSource对象和服务端交互,服务端返回数据时头数据里的内容类型为:text/event-stream。我们的控制器的代码和ResponseBodyEmitter的几乎差不多:@RestController@RequestMapping("/async")@Slf4jpublic class AsyncController {原创 2020-05-19 16:02:05 · 749 阅读 · 1 评论 -
Spring Boot 2.x实战55 - Spring Web MVC 27 - 异步请求(HTTP Streaming - StreamingResponseBody)
我们可以通过返回StreamingResponseBody来直接使用返回的OutputStream来自己控制数据返回。我们也可以使用ResponseEntity来定制状态和头的信息。本例使用StreamingResponseBody返回一张图片,示例控制器如下:@RestController@RequestMapping("/async")@Slf4jpublic class AsyncController { @Value("classpath:wyn.jpg") //1 pri原创 2020-05-19 16:06:16 · 1337 阅读 · 0 评论 -
Spring Boot 2.x实战56 - Spring Web MVC 28 - HTTP/2应用
我们在前面已经配置SSL和开启了HTTP/2(https://blog.youkuaiyun.com/wiselyman/article/details/106121219),我们只需要在控制器方法里的参数使用javax.servlet.http.PushBuilder对象即可使用HTTP/2的推送技术。PushBuilder主动将资源推送到客户端(浏览器);这个特性也需要浏览器的支持,当然现代浏览器绝大部分都支持这个功能。HttpBuilder属于builder模式,主要方法有:path:中间操作,指定需推送的原创 2020-05-19 16:11:05 · 355 阅读 · 0 评论 -
Spring Boot 2.x实战57 - Spring Data 1 - DDD与Spring Data(Repository)
Spring Data 是一个伞型项目,包含主流的数据库的访问技术。这些不同的数据访问项目都使用相同的编程模型,他们都是基于Repository规范接口。我们在本章选关系型数据库的访问技术Spring Data JPA和NoSQL的访问Spring Data Elasticsearch。1. Spring Data Repository1.1 DDD与Spring Data1.1.1 DDDDDD是Domain-Driven Design的缩写,即领域驱动设计。它是解决复杂业务需求的一些列高级技术。原创 2020-05-20 08:10:06 · 1519 阅读 · 0 评论 -
Spring Boot 2.x实战58 - Spring Data 2 - Spring Boot下Spring Data JPA(自动配置)
2.关系数据库 - Spring Data JPA2.1 JPA、Hibernate和Spring Data JPAJPA是Java Persistence API的缩写,即Java持久化API。最新版的JPA 2.2为JSR-338规范也属于Jakarta EE的一部分。 JPA是规范,它对数据库的各种操作的是JPA提供者(如:Hibernate)提供的实现;我们在使用规范开发时,只需要和规范的API打交道而无需关心规范的实现。Spring Data JPA是在JPA提供者之上所做的更高界别的抽象,让原创 2020-05-22 10:10:38 · 368 阅读 · 0 评论 -
Spring Boot 2.x实战59 - Spring Data 3 - DDD下Spring Data JPA(聚合、值对象、库的定义与使用)
2.4 定义聚合2.4.1 定义实体我们使用javax.persistence.Entity注解来定实体类:@Entitypublic class Person {}一个实体类会映射数据库的一张表,我们启用了spring.jpa.hibernate.ddl-auto: update,Spring Data会自动为我们建一个首字母小写的表person。我们可以通过@Table(name = "tb_person")来定制的表名。2.4.2 定义Id我们使用javax.persistence.原创 2020-05-25 10:16:27 · 1100 阅读 · 0 评论 -
Spring Boot 2.x实战60 - Spring Data 4 - Spring Data JPA查询(根据实体属性名推导查询)
2.6 查询2.6.1 查询方法2.6.1.1 推导查询Spring Data JPA支持方法名来中的属性来推导出查询语句。public interface PersonRepository extends JpaRepository<Person, Long> { List<Person> findByNameAndAge(String name, Integer age);}根据方法名findByNameAndAge翻译成查询JPQL语句:select p原创 2020-05-26 08:07:51 · 362 阅读 · 0 评论 -
Spring Boot 2.x实战61 - Spring Data 5 - Spring Data JPA查询(JPA命名查询、JPQL、原生SQL查询)
2.6.1.2 JPA命名查询我们使用@NamedQuery注解在实体上来做命名查询。@Entity@NamedQuery(name = "Person.findByNameWyf", query = "select p from Person p where p.name = 'wyf'")public class Person {若命名的方法和推导查询的方法同名将会覆盖推导查询的方法。在PersonRepository中声明方法:public interface PersonRe原创 2020-05-27 08:12:33 · 259 阅读 · 0 评论 -
Spring Boot 2.x实战62 - Spring Data 6 - Spring Data JPA查询(排序和分页、命名参数、修改查询)
2.6.1.5 排序和分页我们只需要在Repository的方法里使用Sort作为参数即可;方法接受Pageable参数即可分页也可排序。public interface PersonRepository extends JpaRepository<Person, Long> { List<Person> findByAgeLessThan(Integer age, Sort sort); @Query("select p from Person p wher原创 2020-05-28 08:10:23 · 476 阅读 · 0 评论 -
Spring Boot 2.x实战63 - Spring Data 7 - Spring Data JPA查询(定制查询返回Projection:接口或对象)
2.6.1.8 ProjectionSpring Data JPA的查询方法一般返回的是聚合根的一个多或多个实例。我们可以使用Projection,通过聚合根的属性来定制查询返回。我们可以使用接口来定制返回值public interface PersonProjectionInterface { String getName(); //1 Address getAddress(); //2 @Value("#{target.name + ' s age is' + tar原创 2020-05-29 08:03:29 · 380 阅读 · 0 评论 -
Spring Boot 2.x实战64 - Spring Data 8 - Spring Data JPA调用数据库函数/存储过程@Procedure
2.6.2 存储过程Spring Data JPA支持使用@Procedure注解调用数据库的存储过程。我们先定义一个存储过程,入参为name,出差为prefix_name在入参的name前加上Mr./Mrs.。DROP PROCEDURE IF EXISTS add_name_prefix;DELIMITER $$CREATE PROCEDURE add_name_prefix(IN name VARCHAR(255), OUT prefix_name VARCHAR(255))BEGIN原创 2020-06-01 08:11:18 · 669 阅读 · 0 评论 -
Spring Boot 2.x实战65 - Spring Data 9 - Spring Data JPA定制查询Specification
2.6.3 Specification我们可以定义Specification来定制查询,我们需要Repository继承JpaSpecificationExecutor接口;这样我们就可以在方法中使用Specification参数了。Specification是函数接口,只有一个方法:Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder);ro原创 2020-06-02 08:28:04 · 411 阅读 · 0 评论 -
Spring Boot 2.x实战66 - Spring Data 10 - Spring Data JPA动态条件组合查询Query by Example
2.6.4 Query by ExampleQurery by Example简称QBE,它会根据部分属性已经设置的实体,动态进行查询。它主要分为3个部分:Probe:设置属性的实体;ExampleMatcher:对于实体的属性的匹配规则的设置;Example :组合Probe和ExampleMatcher进行查询。直接看代码:@BeanCommandLineRunner queryByExample(PersonRepository personRepository){ retur原创 2020-06-03 08:18:59 · 391 阅读 · 0 评论 -
Spring Boot 2.x实战67 - Spring Data 11 - Spring Data JPA事件监听
2.7 事件监听我们可以在聚合根实体上注解下面的注解来监听聚合操作的事件。@PrePersist:监听实体保存前事件;@PostPersist:监听实体保存后事件;@PreUpdate:监听实体更新前事件;@PostUpdate:监听实体更新后事件;@PreRemove:监听实体删除前事件;@PostRemove:监听实体删除后事件;@PostLoad:监听实体加载后事件。@Data@AllArgsConstructor@NoArgsConstructor@Entitypubl原创 2020-06-04 08:39:28 · 608 阅读 · 0 评论 -
Spring Boot 2.x实战68 - Spring Data 12 - Spring Data JPA领域事件(Domain Events)
2.8 领域事件由于在DDD中采用了“设计小聚合”的原则,因此避免了领域模型的相互关联,从而避免了在应用演进中形成“大泥球”(Big Ball of Mud),也因为上述的原因,本书将不讲解@OneToMany、@ManyToMany等关联注解。聚合之间在没有了关联关系后,聚合之间的数据通讯通过领域事件来完成,领域事件是由聚合根发出的。Spring Data对领域事件做了专门的支持,使用@DomainEvents注解注册领域事件或者继承AbstractAggregateRoot使用它的registerE原创 2020-06-05 08:58:43 · 1419 阅读 · 0 评论 -
Spring Boot 2.x实战69 - Spring Data 13 - Spring Data对Web MVC的支持
2.11 Web支持Spring Data也给Web开发做了一定的支持,他通过@EnableSpringDataWebSupport开启支持。它主要导入了SpringDataWebConfiguration配置,通过它注册了DomainClassConverter、PageableHandlerMethodArgumentResolver。由于SpringDataWebAutoConfiguration自动配置,我们无需再手工定义。通过DomainClassConverter让我们可以通过控制器方法路径原创 2020-06-08 08:54:13 · 294 阅读 · 0 评论 -
Spring Boot 2.x实战70 - Spring Data 14 - Spring Data JPA数据库结构初始化(hibernate正向生成、数据库脚本)
2.12 数据库初始化2.12.1 数据库结构初始化在Spring Boot下会根据我们的实体类的配置自动生成DDL(Data Definition Language数据定义语言,用来定义数据库结构),它可由下面两个外部配置属性开启(二选一):spring.jpa.generate-ddl: true是否在启动时初始化数据库结构。spring.jpa.hibernate.ddl-auto: create相对于上一种配置方式,更倾向使用这里hibernate提供的配置,它提供更细粒度的配置。原创 2020-06-09 08:12:48 · 515 阅读 · 0 评论 -
Spring Boot 2.x实战71 - Spring Data 15 - Spring Data JPA数据库迁移与版本控制(Flyway)
2.12.3 数据库迁移工具Spring Boot支持的数据库迁移工具有Flyway和Liquibase。本节演示着重讲解Flyway的用法。Spring Boot使用FlywayAutoConfiguration使用FlywayProperties来对Flyway进行自动配置,外部配置通过spring.flyway.*前缀进行。我们首先在build.gradle添加Flyway的依赖:dependencies { //... runtimeOnly 'org.flywaydb:flywa原创 2020-06-10 08:14:38 · 566 阅读 · 0 评论 -
Spring Boot 2.x实战72 - Spring Data 16 - Spring Data Elasticsearch环境准备(安装Elasticsearch与新建应用)
3.NoSQL - Spring Data Elasticsearch3.1 关于ElascticsearchElasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎。我们可以将它作为集中的数据存储,从而实现数据的快速检索和高级的分析。我们使用了Spring Data Elasticsearch后,我们可以使用熟悉的Repository变成模型,而无需使用Elasticsearch查询自定义语言。3.2 环境准备3.2.1 安装Elasticsearch使用docker co原创 2020-06-11 08:11:40 · 267 阅读 · 0 评论 -
Spring Boot 2.x实战73 - Spring Data 17 - Spring Data Elasticsearch的自动配置、索引定义(DDD的聚合)、数据操作
3.3 Spring Boot下的自动配置Spring Boot提供的Elasticearch的自动配置主要包括:RestClientAutoConfiguration:使用RestClientProperties通过spring.elasticsearch.rest.*来自动配置Elasticsearch REST客户端。类路径中依赖org.elasticsearch.client:elasticsearch-rest-client,会自动配置RestClient;类路径中的依赖org.ela原创 2020-06-11 08:20:59 · 909 阅读 · 0 评论 -
Spring Boot 2.x实战74 - Spring Data 18 - Spring Data Elasticsearch查询(根据实体属性名推导查询)与原生查询(@Query)
3.6 查询3.6.1 查询方法我们在PersonRepository内定义查询方法,这里的查询和Spring Data JPA推导查询保持一致。public interface PersonRepository extends ElasticsearchRepository<Person,String> { List<Person> findByName(String name); //1 List<Person> findByAddre原创 2020-06-12 08:18:13 · 536 阅读 · 0 评论 -
Spring Boot 2.x实战75 - Spring Data 19 - Spring Data Elasticsearch的search查询(SearchQuery)与统计分析
3.6.2 search查询ElasticsearchRepository除了给我们提供了CRUD和分页排序功能以外,还给我们提供了支持Elasticsearch API的search方法:@NoRepositoryBeanpublic interface ElasticsearchRepository<T, ID> extends ElasticsearchCrudRepository<T, ID> { //... Iterable<T> search(原创 2020-06-15 11:52:19 · 1778 阅读 · 1 评论