Spring实战(第5版)

  • 1. Spring基础
    • 1.1 Spring起步
    • 1.2 开发Web应用
    • 1.3 使用数据
    • 1.4 保护Spring
    • 1.5 使用配置属性
  • 2. Spring集成
    • 2.1 创建REST服务
    • 2.2 消费REST服务
    • 2.3 发送异步消息
    • JMS
    • RabbitMQ
    • Kafka
  • 3. 反应式Spring
  • 4. 云原生Spring
  • 5. 部署Spring

1. Spring基础

1.1 Spring起步

Spring的核心是提供一个容器(container),又叫spring Application Context,会创建和管理bean,将bean装配在一起基于依赖注入(DI),依赖容器去创建和维护所有的组件,注入需要的bean中。
bean的注入方式:

  1. 构造器参数注入
    xml文件中, <constuctor-arg ref="" />
  2. setter注入
  3. 注解方式注入
    java配置 @Configuration 标注配置类,为spring应用上下文提供bean;@bean标注在方法返回的对象以bean的形式添加到spring应用的上下文中。
    借助spring的自动装配和组建扫描,可以自动发现应用类路径下的组件,并创建为bean;

Maven项目结构
项目源码 src/main/java 测试源码 src/test/java 非Java资源 src/main/resources
pom.xml maven构建规范;
Application.java SpringBoot主类,项目启动;
application.properties 指定配置属性

SpringBoot
@SpringBootApplication 包含

  • @SpringBootConfiguration 声明配置类,@Configuration的特殊形式;
  • @EnableAutoConfiguration 启用自动配置;
  • @ComponentScan 组件扫描,通过@Component @Controller @Service声明其他类,自动发现并注册组件

Spring自带一个Web框架,SpringMVC,核心是控制器,处理请求并以某种方式进行信息响应,填充数据模型并将请求传递给视图。@Controller @GetMapping 发送HTTP GET请求; @RequestMapping 类级别使用,通用的请求处理;

thymeleaf模版

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

标签属性:
th:text 命名空间中的属性
th:each="XXX : ${} " 迭代元素集合
th:value 渲染设置value属性
th:src="@{/ }" 图片地址
<link rel="" th:href="@{/ }"/> 引用样式
<form method="POST" th:action="/" /> 提交url
th:if 条件语句

测试类
JUnit
@RunWith(SpringRunner.class) 测试运行器 @SpringBootTest
@WebMvcTest(XXController.class) 是SpringBoot提供的特殊测试注解,将某某注册到SpringMVC中;
注入MockMvc,实现mockup;mockMVC.perform(get("/"))发起对“/”的请求
.andExpect() 期望…;

1.2 开发Web应用

SpringMVC

  1. 构建领域类
    @Data 添加Lombok依赖,节省空间,并且运行时动态生成方法;
  2. 创建控制器类
    处理http请求,@RequestMapping("/") @GetMapping("/")要么将请求传递给视图渲染HTML,要么将数据写入响应体(RESTful);
    @Slf4j ,会自动生成一个SLF4J Logger。
  3. 设计视图–Thymeleaf模版
    添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 表单提交
  2. 控制器提交请求 @PostMapping
  3. 校验表单输入
    Spring支持java的bean校验VadidationAPI;
    @NotNull 非空 @Size 长度 @CreditCardNumber 合法的信用卡号 @Pattern 正则表达式
    @DIgits(integer=) 包含几位数字
    在表单绑定时执行校验,在方法的参数添加@Valid,告诉MVC这个参数要进行校验,校验时机是在绑定表单后,调用这个方法之前;如果失败,fields的hasErrors() 会检验是否有错误,th:errors="*{ }"

DevTools 好处
代码变更后应用会自动重启;
当面向浏览器的资源发生变化时,会自动刷新浏览器;
自动禁用模版缓存;
当DevTools运行时,应用程序会被加载到Java虚拟机两个独立的类加载器中,一个类加载器会加载代码,属性文件等,另一个加载依赖的库,当有变更时,只会重新加载包含项目代码的类加载器;

1.3 使用数据

处理关系型数据时,使用Spring的JDBC和JPA;

JDBC
添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

查询

jdbcTemplate.queryForObject() 返回一个对象
jdbcTemplate.query() 返回对象的集合h d s y y

插入

jdbcTemplate.update()

@SessionAttribute("")指定对象保存在session中,跨请求使用
@modelAttribute(name ="") 在模型中创建对象

Spring Data JPA
SpringData

  • SpringDataJPA 基于关系型数据库进行持久化
  • SpringDataMongo 持久化到Mongo文档数据库
  • SpringDataRedis 持久化Redis key-value存储

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

@Entity 声明实体
@Id 唯一标识属性
@GeneratedValue(strategy = GenerationType.AUTO) 依赖数据库自动生成ID值
@NoArgsConstructor 无参构造器
@RequiredArgsConstructor 有参构造器
@PrePersist 在持久化前做…
@ManyToMany 表之间属性多对多关系
@Table(name = "") 持久化到某个表中

声明JPA的repository
扩展CrudRepository<持久化的实体类型,实体ID属性的类型>
运行时会自动生成实现类,SpringData解析方法名来确定要执行的查询

1.4 保护Spring

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置SpringSecurity
应用启动时,添加依赖后,自动配置功能会探测,初始化基本的安全配置;
通过覆盖WebSecurityConfigurerAdapter基础配置类中定义的configure()方法来进行配置;
SpringSecurity为配置用户存储提供多个方案

  • 基于内存的用户存储
    AuthenticationManagerBuilder.inMemoryAuthentication()指定信息,调用withUser()配置一个用户(用户名),密码和授权信息通过password(),authorities()方法来指定;

  • 基于JDBC的用户存储
    用户信息一般在数据库维护,调用AuthenticationManagerBuilder.jdbcAuthentication().datasource();
    查找用户信息,可以自定义查询, 调用Auth...usersByUsernameQuery();
    密码存储需要使用转码后的密码,通过Auth...passwordEncoder()指定一个encoder密码转码器
    例如StandardPasswordEncode SHA-256哈希加密

  • 以LDAP作为后端的用户存储
    AuthenticationManagerBuilder.ldapAuthentication().userSearchFilter().groupSearchFilter()基础查询提供条件;
    引用远程的LDAP服务器Auth...contextSource().url("指定服务器地址")
    配置嵌入式的LDAP服务器 Auth...contextSource().root指定嵌入式服务器的前缀;

  • *自定义用户认证
    创建领域类实现SpringSecurity的UserDetails接口,会得到getAuthorities()等方法;
    定义repository接口extends CrudRepository<,>,定义一个findByUserName()方法;
    创建用户详情服务接口,实现SpringSecurity的UserDetailsService接口,返回UserDetails对象;
    回到configure方法中,注入userDetailsService,调用Auth.userDetailsService(),调用passwordEncoder()进行密码转码,查询用户信息;

保护Web请求
配置HttpSecurity常见的需求是拦截请求以确保用户具备适当的权限,

httpSecurity.authorizeRequests().antMatchers("/").hasRole("")

登录

.and().formLogin().loginPage("/")

退出

.and().logout().logoutSuccessUrl("/")

防止跨站请求伪造
SpringSecurity 提供了内置的CSRF(跨站请求伪造)保护,如果使用SpringMVC的jsp标签库或者thyme leaf方言,会自动生成包含CSRF token的隐藏域;

已认证用户的信息可以通过SecurityContext对象来获取,也可以用@AuthenticationPrincipal注入控制器中;

1.5 使用配置属性

Spring中有两种配置

  • bean装配:声明在Spring应用上下文中创建那些应用组件以及它们之间如何互相注入的配置;
  • 属性注入:设置Spring应用上下文中bean的值的配置;

环境抽象 application.yaml文件中
端口号

server:port: XXX

配置数据源

spring:datasource:url:username:password:

配置嵌入式服务器
任选一个可用的端口

server:port: 0

常见的对底层容器的设置就是处理HTTPS请求
JDK keytool命令生成keystore

$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA

配置日志
SpringBoot 通过Logback配置日志,INFO级别写入;

logging:file: / level:root: WARNorg.springframwork.security:DEBUG

创建自己的配置属性
@ConfigurationProperties(prefix=“XX.XX”)

XX:XX:属性值:XX

使用profile进行配置
application-{profile名}.yml
激活profile 使用环境变量来设置处于激活状态的profile;

% export SPRING_PROFILES_ACTIVE =prod,xx,xx

2. Spring集成

2.1 创建REST服务

创建RESTful控制器

  • @RestController
    能够让类被组件扫描功能发现,并且控制器中的所有处理器方法的返回值都要直接写入响应体中;

  • @Controller@ResponseBody
    这样返回的就是ResponseEntity对象;

  • @RequestMapping(path="/",produces={“application/json”,""})
    代表只会处理Accept头信息包含"application/json"的请求,限制API只生成JSON结果。

  • @CrossOrigin(origins="*")
    允许来自任何域的客户端消费该API

  • @PathVariable(“XX”) @GetMapping("/{/XX}") 对应

返回值设为ResponseEntity,有返回值则ok的HTTP状态,否则为NOT FOUND的状态;

发送数据到服务器端

  • @PostMapping(consumes=“application/json”)
    用于指定请求输入,只会处理相匹配的请求;
  • @RequestBody
    表示请求被转换,并绑定到该参数上,确保请求体中的JSON被绑定;

在服务器上更新数据

  • @PutMapping()
    对资源数据的大规模替换
  • @PatchMapping()
    只发送要改变的属性即可;

删除服务器上的数据

  • @DeleteMapping()

启用数据后端服务
添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

它会为Spring Data创建的repository自动生成REST API;
@RestResource(rel="",path="") 能为实体提供任何我们想要的关系名和路径;

分页与排序
http://localhost:8080/xx/xx/xx?sort=creatAt,desc&page=X&size=X

2.2 消费REST服务

  • RestTemplate Spring核心框架提供的简单、同步REST客户端
    使用Rest Template消费REST端点
    GET
    getForObject() 返回的是响应载荷的领域对象
    getForEntity() 返回的是包裹领域对象的ResponseEntity对象,能够访问更多的响应细节,比如响应头信息;
    PUT
    restTemplate.put()
    DELETE
    restTemplate.delete()
    POST
    postForLocation() 返回的是URL
    postForObject()
    postForEntity()
  • Traverson Spring HATEOAS支持超链接、同步的REST客户端
  • WebClient Spring5引入的反应式、异步REST客户端

2.3 发送异步消息

JMS

JMS发送消息
使用消息代理的通用API,基于JmsTemplate,消息生产方发送队列和主题消息,提供消息驱动POJO;
搭建环境,使用ActiveMQ;
添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

配置属性

spring:activemq:broker-url: 代理的urluser: 访问代理的用户password: 密码in-memory: 是否在内存中运行代理,默认为true

send(),都需要MessageCreator来生成Message对象;
converAndSend()接受Object对象,自动转换为Message对象;

配置消息转换器 MessageConverter 有两个方法, ToMessage(),fromMessage()

接收JMS消息
receive() ;接收XX队列的消息;
receiveAndConvert() 不需要MessageConverter注入进来,转换操作在方法幕后进行;

声明消息监听器
@JmsListener(“xx.xx.quene”)
这个注解会等待消息抵达指定的目的地,当消息到达时,方法被自动被调用;优点是不会堵塞,快速处理多个消息;缺点是只能用在Java应用中;

RabbitMQ

RabbitMQ是AMQP最杰出的实现。JMS消息使用目的地来寻址,接收者要从这里检索消息;AMQP消息使用Exchange和routing key 来寻址,消息就与接收者要监听的对列解耦了;
当消息到RabbitMQ代理的时候,它会进入设置的Exchange上,由它负责路由到一个或多个队列中,过程会根据Exchange的类型,Exchange和队列之间的blinding,消息的routing key 进行路由;
添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

配置属性

spring:rabbitmq:host:port:username:password:

RabbitTemplate发送消息和接收消息基本同JMS;
@RabbitListener("")消息监听器

Kafka

为集群运行设计,可扩展性很强,仅使用主题实现消息的发布/订阅;

3. 反应式Spring

4. 云原生Spring

5. 部署Spring

Spring实战(第5版)核心知识点总结相关推荐

  1. Spring实战(第3版)

    <Spring实战(第3版) > 基本信息 原书名:Spring in Actiong(third edition) 作者: (美)Craig Walls 译者: 耿渊 张卫滨 出版社:人 ...

  2. 《spring实战第四版》的读书笔记

    <spring实战第四版>的读书笔记 1 概述 <Spring实战第四版>描述了Spring4架构的设计,看完了以后,最大感觉是Spring的IOC与aop理念实在是太强大了, ...

  3. Spring实战(第四版)

    Spring实战(第四版) 链接:https://pan.baidu.com/s/1PhnJqOsQPz5hqe-zxkqPOg 提取码:eu15 复制这段内容后打开百度网盘手机App,操作更方便哦

  4. Spring实战第五版源码

    Spring实战第五版源码 链接:https://pan.quark.cn/s/11a451b1aa84 提取码:uzGW

  5. Spring实战第五版第二章字段校验返回视图报错解决及javax.validation完整pom依赖

    Spring实战第五版第二章 2.3 校验表单输入 在编写"/design"页面post处理逻辑时,按照书本上直接'return "design"; '方式,会 ...

  6. Spring实战(第4版)

    Spring实战第四版,在线阅读地址:https://potoyang.gitbook.io/spring-in-action-v4/,根据 pdf 整理完成.

  7. Spring实战第五版观后感之第一章

    spring所做的一切都是在简化开发,所以今天我们就来说说我所了解到的第一章的内容 一.什么是Spring? Spring的核心是提供了一个容器,通常称为Spring应用上下文,它们会创建和管理应用组 ...

  8. Spring 实战 第4版 读书笔记

    第一部分:Spring的核心 1.第一章:Spring之旅 1.1.简化Java开发 创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB.相对EJB来说,Spring提供 ...

  9. Spring 实战(第 5 版)

    https://potoyang.gitbook.io/spring-in-action-v5/

  10. Spring实战(第4版)第2章 装配Bean

    文章目录 Spring实战(第4版)第2章 装配Bean 2.1 Spring配置的可选方案 2.2 自动化装配bean 2.2.1 创建可被发现的bean 2.2.2 为组件扫描的bean命名 2. ...

最新文章

  1. MySQL中的整数类型
  2. StackOverflow How to programmatically unplug replug an arbitrary USB device? 如何以编程方式拔出并重新插入任意USB设备
  3. 三年级人教版下学期计算机教案,人教版三年级下册信息技术教案
  4. 初级Java开发工程师!绝密文档,面试手册全面突击!!!秋招已经到来
  5. 阿里云Kubernetes服务上从零搭建GitLab+Jenkins+GitOps应用发布模型的实践全纪录
  6. 10进制转62进制 java_两种方法实现10进制和62进制互转 | 学步园
  7. VMware VSphere 引发的学案(三)
  8. java hibernate4 学习心得
  9. 关于for in和for循环的遍历
  10. sqlprompt安装注册
  11. 射频电路设计——传输线理论
  12. 先面对现实,再寻找理想
  13. 2008年国外最漂亮的50个网站欣赏
  14. Pytorch Note40 词嵌入(word embedding)
  15. 拼多多商家制作商品详情页的技巧?
  16. 掐头去尾-利用正则表达式的匹配顺序
  17. 奥鹏福建师范计算机应用作业,奥鹏福建师范【计算机应用基础】在线作业一、二答案在末尾...
  18. Caffe深度学习框架作者贾扬清online内容分享II
  19. 于的繁体字有几种写法_与的繁体字怎么写_与字有几笔、五行属性-幸运吧起名网...
  20. HyperMesh快捷键、鼠标操作、键盘操作

热门文章

  1. 【转载】嵌入式自学经历和体会
  2. 【铨顺宏项目推荐】RFID无线射频识别技术的设计思路
  3. C++沉思录中文版pdf
  4. 计算机网络七层体系结构
  5. python与分形0011 - 【教程】带辐条的多边形
  6. C语言100ms周期运行时间不够,DEH-系统调研报告.docx
  7. python图书库存管理系统的需求分析_图书库存管理系统方案.doc
  8. 转:如何破解超星打印页数限制
  9. 传说中的世界500强面试题-推理能力(1)
  10. u盘推荐知乎_求推荐好用的u盘?