最近把《spring实战第四版》读了一遍,跳过了有些过时的章节,把一些要点摘录下来,方便以后回忆。
内容摘录于自己的有道云笔记
),格式都没能保留。。
第1部分 Spring的核心
第1章 Spring之旅
1.1 简化Java开发
1.2 容纳你的Bean
1.3 俯瞰Spring风景线
1.4 Spring的新功能
1.5 小结
第2章 装配Bean
2.1 Spring配置的可选方案
2.2 自动化装配bean
2.3 通过Java代码装配bean
2.4 通过XML装配bean
2.5 导入和混合配置
2.6 小结
第3章 高级装配
3.1 环境与profile
3.2 条件化的bean
3.6 小结
第4章 面向切面的Spring
4.1 什么是面向切面编程
4.2 通过切点来选择连接点
4.3 使用注解创建切面
4.4 在XML中声明切面
4.5 注入AspectJ切面
4.6 小结
第2部分 Web中的Spring
第5章 构建Spring Web应用程序
5.1 Spring MVC起步
5.2 编写基本的控制器
5.3 接受请求的输入
5.4 处理表单
第6章 渲染Web视图
6.1 理解视图解析
6.2 创建JSP视图
6.3 使用Apache Tiles视图定义布局
6.5 小结
第7章 Spring MVC的高级技术
7.1 Spring MVC配置的替代方案
7.2 处理multipart形式的数据
7.3 处理异常
7.4 为控制器添加通知
7.5 跨重定向请求传递数据
第9章 保护Web应用
9.1 Spring Security简介
9.2 选择查询用户详细信息的服务
9.3 拦截请求
9.4 认证用户
9.5 保护视图
9.6 小结
第3部分 后端中的Spring
第10章 通过Spring和JDBC征服数据库
10.1 Spring的数据访问哲学
Spring提供了多个可选的模板。如果直接使用JDBC,那你可以选择JdbcTemplate。如果你希望使用对象关系映射
10.2 配置数据源
10.3 在Spring中使用JDBC
10.4 小结
第11章 使用对象-关系映射持久化数据
11.1 在Spring中集成Hibernate
11.4 小结
第12章 使用NoSQL数据库
12.1 使用MongoDB持久化文档数据
12.3 使用Redis操作key-value数据
12.4 小结
第13章 缓存数据
13.1 启用对缓存的支持
13.3 使用XML声明缓存
13.4 小结
第14章 保护方法应用
14.1 使用注解保护方法
第4部分 Spring集成
第15章 使用远程服务
15.1 Spring远程调用概览
15.2 使用RMI
15.3 使用Hessian和Burlap发布远程服务
15.4 使用Spring的HttpInvoker
15.5 发布和使用Web服务
15.6 小结
第16章 使用Spring MVC创建REST API
16.1 了解REST
16.3 提供资源之外的其他内容
16.4 编写REST客户端
16.5 小结
第17章 Spring消息
17.1 异步消息简介
17.2 使用JMS发送消息
17.3 使用AMQP实现消息功能
17.4 小结
第21章 借助Spring Boot简化Spring开发
简化spring开发、使用
21.1 Spring Boot简介
21.2 使用Spring Boot构建应用
21.3 组合使用Groovy与Spring Boot CLI
21.4 通过Actuator获取了解应用内部状况
21.5 小结
第1部分 Spring的核心
第1章 Spring之旅
1.1 简化Java开发
1.1.1 激发POJO的潜能
pojo 原始性,可迁移别的平台
1.1.2 依赖注入
DI ,松散,低耦合(xml 或者java ) 面向应用,而不用管如何装配
1.1.3 应用切面
AOP 也是无需显示调用,而是
面点前后通知
1.1.4 使用模板消除样板式代码
jdbc应用
1.2 容纳你的Bean
1.2.1 使用应用上下文
2注(注配注网)类径文系X网。2注泪径,温习了X网。
AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。
AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文。
ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类
资源。
FileSystemXmlapplicationcontext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。
1.2.2 bean的生命周期
1.3 俯瞰Spring风景线
1.3.1 Spring模块
1.3.2 Spring Portfolio
1.4 Spring的新功能
1.4.1 Spring 3.1新特性
1.4.2 Spring 3.2新特性
1.4.3 Spring 4.0新特性
1.5 小结
第2章 装配Bean
2.1 Spring配置的可选方案
它提供了三种主要的装配机制:
在XML中进行显式配置。
在Java中进行显式配置。
隐式的bean发现机制和自动装配。
2.2 自动化装配bean
2.2.1 创建可被发现的bean
@Component 、controller service bean 等
bean 常用要素: id、name,class,scope
子元素:constructor-arg 、 property
2.2.2 为组件扫描的bean命名
@Component(”beanname“)
2.2.3 设置组件扫描的基础包
@ComponentScan(“basepackage”)
2.2.4 通过为bean添加注解实现自动装配
@autowired
用在setter方法或者构造器上
2.2.5 验证自动装配
2.3 通过Java代码装配bean
有些复杂的bean只能手动
尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配
置Spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添
加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了。
2.3.1 创建配置类
使用@Configuration 声明一个Config类
2.3.2 声明简单的bean
@Bean 定义一个 方法bean
2.3.3 借助JavaConfig实现注入
那么该bean 即可被自动填充进来
2.4 通过XML装配bean
创建xml文件,按规范
2.4.1 创建XML配置规范
2.4.2 声明一个简单的
参数的声明方法:
a。
b。使用Spring 3.0所引入的c-命名空间
2.4.3 借助构造器注入初始化bean
2.4.4 设置属性
2.5 导入和混合配置
2.5.1 在JavaConfig中引用XML配置
2.5.2 在XML配置中引用JavaConfig
2.6 小结
第3章 高级装配
环境、名字、作用域 环域名 换个域名,高级装配
3.1 环境与profile
3.1.1 配置profile bean
@Profile(SomeClass.class)
3.1.2 激活profile
配置active或者default
test的时候使用AtiveProfile来指定profile
3.2 条件化的bean
@Conditional(SomeClass).然后someClass来实现condition的match接口,match中可以获取上下文变量
3.3 处理自动装配的歧义性
3.3.1 标示首选的bean
@Primary
3.3.2 限定自动装配的bean
使用@Qualifier(”id“)代表只要这个id的been
也自己编写标注
3.4 bean的作用域
单例、原型、会话、请求:单元话请,单元请人对话,确定scope范围
3.4.1 使用会话和请求作用域
3.4.2 在XML中声明作用域代理
3.5 运行时值注入
3.5.1 注入外部的值
自动装配env,然后从环境里读取
使用占位符
3.5.2 使用Spring表达式语言进行装配
咒语SPel,格式 #{} 警察扩音器
3.6 小结
第4章 面向切面的Spring
应用:日志、缓存、安全、事务 日缓安事 日缓慢的安上了完事;
4.1 什么是面向切面编程
术语解释:
连接点:就是全身可以操作的点,比如全身上下允许注射的静脉位置,java应用里 比如类初始化,变量改变,调用方法时、抛出异常时、甚至修改一个字段时。这些发生改变的可以用来观察的因果点
切点:就是要注入的点,就是医生要注射的点,就是程序中可以拦截的点,类比拦截器对特定path进行拦截,我们通常使用
明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。有些AOP框架允许我们创建动态的切点,可以根据运
行时的决策(比如方法的参数值)来决定是否应用通知。
advice:就是在切点处进行的操作,比如注射前先消毒,注射时注入特定注射液,注射后摁住等等
aspect:就是包含切点和advice一整体的类、方法体,类似于整个interceptor类
https://blog.csdn.net/q982151756/article/details/80513340
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:
编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增
强该目标类的字节码。AspectJ 5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。
4.1.1 定义AOP术语
4.1.2 Spring对AOP的支持
Spring在在运运行行时时通通知知对对象象
通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理的bean中。如图4.3所示,代理类封装了目标类,并拦截被通知方法的调
用,再把调用转发给真正的目标bean。当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑。
4.2 通过切点来选择连接点
因为Spring基于动态代理,所以Spring只支持方法连接点。这与一些
其他的AOP框架是不同的,例如AspectJ和JBoss,除了方法切点,它们还提供了字段和构造器接入点。
4.2.1 编写切点
Spring借助AspectJ的的切点表达式语来定义Spring切面
AspectJ指示器 描 述
arg() 限制连接点匹配参数为指定类型的执行方法
@args() 限制连接点匹配参数由指定注解标注的执行方法
execution() 用于匹配是连接点的执行方法
this() 限制连接点匹配AOP代理的bean引用为指定类型的类
target 限制连接点匹配目标对象为指定类型的类
@target() 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
within() 限制连接点匹配指定的类型
@within() 限制连接点匹配指定注解所标注的类型(当使用Spring AOP时,方法定义在由指定的注解所标注的类里)
@annotation 限定匹配带有指定注解的连接点
4.2.2 在切点中选择bean
除了所列的指示器外,Spring还引入了一个新的bean()指示器,它允许我们在切点表达式中使用bean的ID来标识bean。bean()使用bean ID或bean名称作为参数来限制切点只匹配特定的bean。
4.3 使用注解创建切面
4.3.1 定义切面
相关注解的写法:
注解实例
4.3.2 创建环绕通知
4.3.3 处理通知中的参数
4.3.4 通过注解引入新功能
4.4 在XML中声明切面
4.4.1 声明前置和后置通知
4.4.2 声明环绕通知
4.4.3 为通知传递参数
4.4.4 通过切面引入新的功能
4.5 注入AspectJ切面
4.6 小结
第2部分 Web中的Spring
第5章 构建Spring Web应用程序
5.1 Spring MVC起步
5.1.1 跟踪Spring MVC的请求
request-->DispatchServerlet--->handlerMapping---->controller--->viewResolver-->view
5.1.2 搭建Spring MVC
|
配置dispatchServerlet,实现ServletContainerInitializer,下面是需要实现的方法
|
|
方法一
|
getServletMappings
|
进行路径映射
|
|
|
方法二
|
GetServletConfigClasses
|
返回的带有@Configuration注解的 类将会用来定义DispatcherServlet应用上下文中的bean
|
DispatcherServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射
|
|
方法三
|
getRootConfigClasses()
|
方法返回的带有@Configuration注解的类将 会用来配置ContextLoaderListener创建的应用上下文中的bean。
|
ContextLoaderListener要加载 应用中的其他bean。这些bean通常是驱动应用后端的中间层和数据层组件。
|
serverlet 都有哪些配置呢?
- 启用spring MVC
- 配置组件扫描
- 配置视图解析器
- 配置静态资源加载器
5.1.3 Spittr应用简介
5.2 编写基本的控制器
5.2.1 测试控制器
5.2.2 定义类级别的请求处理
@RequestMapping({"/","/otherPath",method=POST})
5.2.3 传递模型数据到视图中
5.3 接受请求的输入
参数的形式
- 请求参数里
- 请求路径里
- 表单里
5.3.1 处理查询参数
@RequestParam(value="FieldName",defaultValue="")
5.3.2 通过路径参数接受输入
@RequestMapping({"/{fieldName}",method=POST})
@PathVariable("spittleId")
5.4 处理表单
5.4.1 编写处理表单的控制器
5.4.2 校验表单
- 在pojo的属性前加上合法注解
- 在controller里加上valid注解
5.5 小结
第6章 渲染Web视图
6.1 理解视图解析
- viewResolver接口接受视图string和locale对象,返回一个view接口,
- view接口负责渲染
内置13中resolver,只需进行配置
6.2 创建JSP视图
6.2.1 配置适用于JSP的视图解析器
6.2.2 使用Spring的JSP库
6.3 使用Apache Tiles视图定义布局
6.3.1 配置Tiles视图解析器
6.4 使用Thymeleaf
6.4.1 配置Thymeleaf视图解析器
6.4.2 定义Thymeleaf模板
6.5 小结
jsp技术以及被前后端分离替代,暂不关注
第7章 Spring MVC的高级技术
7.1 Spring MVC配置的替代方案
7.1.1 自定义DispatcherServlet配置
- serverletInitializer 的三个只是必要方法,还有额外方法customizeRegistration 重载自定义注册
在AbstractAnnotation-
ConfigDispatcherServletInitializer将DispatcherServlet注册到Servlet容器中之后,就会调
用customizeRegistration(),并将Servlet注册后得到的Registration.Dynamic传递进来。通过重
载customizeRegistration()方法,我们可以对DispatcherServlet进行额外的配置
7.1.2 添加其他的Servlet和Filter
实现Spring的WebApplicationInitializer接口,在该方法中可以向参数里的context加载servlet 或者filter
7.1.3 在web.xml中声明DispatcherServlet
7.2 处理multipart形式的数据
7.2.1 配置multipart解析器
7.2.2 处理multipart请求
三种格式
@RequestPart("") byte[] bytes 字节流的形式
@RequestPart("") Part part part格式
实现了MultipartFile接口
7.3 处理异常
7.3.1 将异常映射为HTTP状态码
7.3.2 编写异常处理的方法
@ExceptionHanler
7.4 为控制器添加通知
单独创建一个类,使用@ControllerAdvice注解来创建控制器通知
7.5 跨重定向请求传递数据
7.5.1 通过URL模板进行重定向
7.5.2 使用flash属性
7.6 小结
第8章 使用Spring Web Flow
webflow已不适用,跳过
8.1 在Spring中配置Web Flow
8.1.1 装配流程执行器
8.1.2 配置流程注册表
8.1.3 处理流程请求
8.2 流程的组件
8.2.1 状态 8.2.2 转移
8.2.3 流程数据
8.3 组合起来:披萨流程
8.3.1 定义基本流程
8.3.2 收集顾客信息
8.3.3 构建订单
8.3.4 支付
8.4 保护Web流程
8.5 小结
第9章 保护Web应用
9.1 Spring Security简介
用于配置相关界面进入之前的鉴权
9.1.1 理解Spring Security的模块
11个模块,有ACL ,core,configuration,web等
9.1.2 过滤Web请求
本质上是代滤社DelegatingFilterProxy 会 委托给过滤链springSecurityFilterChain,过滤链在web初始化时addFilter 助记:大反派委托给国旅联合
9.1.3 编写简单的安全性配置
简单来讲就是实现WebSecurityConfigurerAdapter,同时启用@EnableWebMvcSecurity
里面有三个方法
分别对应http、web、AuthencationManagerBuilder
9.2 选择查询用户详细信息的服务
选择在哪里查询用户信息
9.2.1 使用基于内存的用户存储
9.2.2 基于数据库表进行认证
9.2.3 基于LDAP进行认证
不懂
9.2.4 配置自定义的用户服务
这里面几个概念
- 通过 AuthenticationManager 提供了进行用户认证方法的抽象,允许通过 ProviderManager 和 AuthenticationProvider 来组装和实现自己的认证方法
- 通过 UserDetails 和 UserDetailsService 提供了用户详细信息和获取用户详细信息方式的抽象【存储用户在后端的真实记录】
- 通过 Authentication 提供了用户认证信息和认证结果的抽象【存储用户通过前端传来的待验证信息】
- 通过 SecurityContext 和 SecurityContextHolder 提供了保存认证结果的方式
详见文章https://www.cnblogs.com/rgbit/p/11784371.html
其中需要实现userDetailService
9.3 拦截请求
9.3.1 使用Spring表达式进行安全保护
9.3.2 强制通道的安全性
requiresChannel()方
法,借助这个方法能够为各种URL模式声明所要求的通道。
9.3.3 防止跨站请求伪造
9.4 认证用户
9.4.1 添加自定义的登录页
调用formLogin()
9.4.2 启用HTTP Basic认证
9.4.3 启用Remember-me功能
9.4.4 退出
9.5 保护视图
9.5.1 使用Spring Security的JSP标签库
9.5.2 使用Thymeleaf的Spring Security方言
9.6 小结
第3部分 后端中的Spring
第10章 通过Spring和JDBC征服数据库
消除持久化代码里的模板代码
10.1 Spring的数据访问哲学
使用Repository来避免应用与数据访问策略耦合在一起,Repository背后可以对应多种数据库访问技术
10.1.1 了解Spring的数据访问异常体系
10.1.2 数据访问模板化
Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)和回调(callback)
Spring提供了多个可选的模板。如果直接使用JDBC,那你可以选择JdbcTemplate。如果你希望使用对象关系映射
框架,那HibernateTemplate或JpaTemplate可能会更适合你。
10.2 配置数据源
无论选择Spring的哪种数据访问方式,你都需要配置一个数据源的引用。Spring提供了在Spring上下文中配置数据源bean的多种方式,包括:
- 通过JDBC驱动程序定义的数据源;
- 通过JNDI查找的数据源;
- 连接池的数据源。
重点就是DI一个datasource
10.2.1 使用JNDI数据源
?
10.2.2 使用数据源连接池
10.2.3 基于JDBC驱动的数据源
与连接池的区别在于,这里的连接只有一个
10.2.4 使用嵌入式的数据源
10.2.5 使用profile选择数据源
通过使用@Profile 来选择在不同的环境使用不同的source
10.3 在Spring中使用JDBC
10.3.1 应对失控的JDBC代码
正常的一个数据库操作包括
连接数据库,获取连接;创建sql语句;执行操作;处理返回对象;捕获异常;断开连接,清理资源
这些可以复用的代码称为样板代码
10.3.2 使用JDBC模板
第一步,创建JdbcTemplate,会自动注入配置过的datasource
第二部,使用JdbcOperations,operations 会在template生成之后自动注入进来
10.4 小结
学习了如何配置jdbc,以及使用模板代码来操作数据库
第11章 使用对象-关系映射持久化数据
jdbc的基础功能比较简单,不能满足一些复杂特性
- 延迟加载(Lazy loading):随着我们的对象关系变得越来越复杂,有时候我们并不希望立即获取完整的对象间关系。举一个典型的例子,假设我们在查询一组PurchaseOrder对象,而每个对象中都包含一个LineItem对象集合。如果我们只关心PurchaseOrder的属性,那查询出LineItem的数据就毫无意义。而且这可能是开销很大的操作。延迟加载允许我们只在需要的时候获取数据。
- 预先抓取(Eager fetching):这与延迟加载是相对的。借助于预先抓取,我们可以使用一个查询获取完整的关联对象。如果我们需要PurchaseOrder及其关联的LineItem对象,预先抓取的功能可以在一个操作中将它们全部从数据库中取出来,节省了多次查询的成本。
- 级联(Cascading):有时,更改数据库中的表会同时修改其他表。回到我们订购单的例子中,当删除Order对象时,我们希望同时在数据库中删除关联的LineItem。
object-relational mapping,ORM提供了很多丰富的特性,Spring对多个持久化框架都提供了支持,包括Hibernate、iBATIS、Java数据对象(Java Data Objects,JDO)以及Java持久化API(Java
Persistence API,JPA)。
11.1 在Spring中集成Hibernate
使用Hibernate所需的主要接口是org.hibernate.Session。Session接口提供了基本的数据访问功能
11.1.1 声明Hibernate的Session工厂
- Session对象通过SessionFactoryBean生成
- factoryBean的生成方法:初始化;配参数,这里参数包括[datasource, dialect,要管理的对象结构]
如下图
11.1.2 构建不依赖于Spring的Hibernate代码
使用session来操作数据库
11.2 Spring与Java持久化API
JPA的应用程序需要的接口是由EntityManageer提供,而他是由用EntityManagerFactory生成。
EntityManagerFactory的生成方式有两种:
应用程序管理类型(Application-managed):当应用程序向实体管理器工厂直接请求实体管理器时,工厂会创建一个实体管理器。在这种模式下,程序要负责打开或关闭实体管理器并在事务中对其进行控制。这种方式的实体管理器适合于不运行在Java EE容器中的独立应用程序。【程序负责维护manager的打开或关闭】
容器管理类型(Container-managed):实体管理器由Java EE创建和管理。应用程序根本不与实体管理器工厂打交道。相反,实体管理器直接通过注入或JNDI来获取。容器负责配置实体管理器工厂。这种类型的实体管理器最适用于Java EE容器【程序用就行了,不用维护】
11.2.1 配置实体管理器工厂
这里只讲容器管理类型下的配置,只需要制定datasource 和adapter(U盘和适配器)
11.2.2 编写基于JPA的Repository
使用@PersistenceContext 创建entityManager
11.3 借助Spring Data实现自动化的JPA Repository
代码中依然有样板代码,
对于每一个entity,都要 写一个方法
对于同一个操作类型,比如findall都要写多次方法
spring data 把这又推进了一步。
- 在Java配置类上添加@EnableJpaRepositories注解。这会开始对该value所包含的package进行扫描
- 继承Spring Data JPA的JpaRepository接口
SpitterRepository扩展了Spring Data JPA的JpaRepository(稍后,我会介绍几个其他的接口)。通过这种方式,JpaRepository进行了参数化,所以它就能知道这是一个用来持久化Spitter对象的Repository,并且Spitter的ID类型为Long。另外,它还会继承18个执行持久化操作的通用方法,如保存Spitter、删除Spitter以及根据ID查询Spitter
11.3.1 定义查询方法
当创建Repository实现的时候,Spring Data会检查Repository接口的所有方法,解析方法的名称,并基于被持久化的对象来试图推测方法的目的。本质上,Spring Data定义了一组小型的领域特定语言(domain-specific language ,DSL),在这里,持久化的细节都是通过Repository方法的签名来描述的。
只需要定义接口,而不用实现
11.3.2 声明自定义查询
如果所需的数据无法通过方法名称进行恰当地描述,那么我们可以使用@Query注解
11.3.3 混合自定义的功能
某些query无法实现,只好借助原生的jpa来实现,这时可以
- 新建类通过em来操作sql
- 组合这个类
如下图
11.4 小结
hibernate 使用session,jpa使用entitymanager,
使用spring data 连接口的实现都不用写了
第12章 使用NoSQL数据库
括MongoDB、Neo4j和Redis。它不仅支持自动化的Repository,还支持基于模板的数据访问和映射注解
12.1 使用MongoDB持久化文档数据
12.1.1 启用MongoDB
借助@EnableMongoRepositories用用Spring Data MongoDB
12.1.2 为模型添加注解,实现MongoDB持久化
12.1.3 使用MongoTemplate访问MongoDB
使用mongoOperations来操作
12.1.4 编写MongoDB Repository
跟jpa的类似
先启用(12.1.1里已经启用过了),然后扩展MongoRepository
12.2 使用Neo4j操作图数据
该部分略过
12.2.1 配置Spring Data Neo4j
12.2.2 使用注解标注图实体
12.2.3 使用Neo4jTemplate
12.2.4 创建自动化的Neo4j Repository
12.3 使用Redis操作key-value数据
12.3.1 连接到Redis
实现redis连接工厂方法
12.3.2 使用RedisTemplate
redis提供了两个模板
RedisTemplate
StringRedisTemplate
针对redis的物种数据类型,template提供了多种api
12.3.3 使用key和value的序列化器
redis在存储和取回的时候,对相应数据进行了序列化,可以使用的序列化器有
GenericToStringSerializer:使用Spring转换服务进行序列化;
JacksonJsonRedisSerializer:使用Jackson 1,将对象序列化为JSON;
Jackson2JsonRedisSerializer:使用Jackson 2,将对象序列化为JSON;
JdkSerializationRedisSerializer:使用Java序列化;
OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化;
StringRedisSerializer:序列化String类型的key和value。
我们可以制定使用哪个方式来序列化
12.4 小结
第13章 缓存数据
13.1 启用对缓存的支持
1.启用缓存@EnableCaching
2.初始化缓存管理器
13.1.1 配置缓存管理器
spring基于缓存存储的位置提供了多个缓存管理器,以redis为例,
- 先生成redis的连接工厂
- 再生成redis 的缓存管理器
13.2 为方法添加注解以支持缓存
启用了缓存之后,需要在使用缓存的地方加上注解
13.2.1 填充缓存
cacheable 如果发现缓存存在,就不会再调用方法,
而cacheput 无论如何都会调用,相当于把结果顺便存到缓存里,这样的好处是别的方法去请求的时候,可以直接读缓存
可以通过SpEL表达式制定缓存的key,result是该方法的返回结果
13.2.2 移除缓存条目
@CacheEvice
13.3 使用XML声明缓存
略过
13.4 小结
缓存实际上是一种切面,注解添加了切点
第14章 保护方法应用
使用secured来限制方法请求者的权限
14.1 使用注解保护方法
14.1.1 使用@Secured注解限制方法调用
14.1.2 在Spring Security中使用JSR-250的@RolesAllowed注解
14.2 使用表达式实现方法级别的安全性
14.2.1 表述方法访问规则
14.2.2 过滤方法的输入和输出
14.3 小结
第4部分 Spring集成
第15章 使用远程服务
分布式服务之间的发布和调用
15.1 Spring远程调用概览
java可以使用的远程调用技术
- 远程方法调用(Remote Method Invocation,RMI);
- Caucho的Hessian和Burlap;
- Spring基于HTTP的远程服务;
- 使用JAX-RPC和JAX-WS的Web Service。
spring提供了一个代理bean,让我们访问远程的方法,就像访问本地的一样
15.2 使用RMI
15.2.1 导出RMI服务
- 1.编写一个服务实现类,类中的方法必须抛出java.rmi.RemoteException异常;
- 2.创建一个继承于java.rmi.Remote的服务接口;
- 3.运行RMI编译器(rmic),创建客户端stub类和服务端skeleton类;
- 4.启动一个RMI注册表,以便持有这些服务;
- 5.在RMI注册表中注册服务。
手动的化需要这些步骤,spring简化了样板代码,通过配置rmi导出器即可完成导出
15.2.2 装配RMI服务
使用远程服务很简单,只需要配置代理工厂bean就行了
代理工厂生成的代理会处理网络交互的细节
15.3 使用Hessian和Burlap发布远程服务
Hessian,像RMI一样,使用二进制消息进行客户端和服务端的交互。
Burlap是一种基于XML的远程调用技术
海森二,伯来x
15.3.1 使用Hessian和Burlap导出bean的功能
同样是配置导出器,但是hessian是基于http的,所以还需要配置serverlet的mapping
15.3.2 访问Hessian/Burlap服务
同样创建代理工厂bean
15.4 使用Spring的HttpInvoker
15.4.1 将bean导出为HTTP服务
15.4.2 通过HTTP访问服务
15.5 发布和使用Web服务
15.5.1 创建基于Spring的JAX-WS端点
15.5.2 在客户端代理JAX-WS服务
15.6 小结
Spring隐藏了远程服务的很多细节,让它们表现得好像是本地JavaBean一样
第16章 使用Spring MVC创建REST API
16.1 了解REST
表述性状态转移(Representational State Transfer,REST)
16.1.1 REST的基础知识
16.1.2 Spring是如何支持REST的
- 控制器可以处理所有的HTTP方法,包含四个主要的REST方法:GET、PUT、DELETE以及POST。 借助@PathVariable注解,控制器能够处理参数化的URL(将变量输入作为URL的一部分)
- 借助Spring的视图和视图解析器,资源能够以多种方式进行表述,包括将模型数据渲染为XML、JSON、Atom以及RSS的View实现;
- 可以使用ContentNegotiatingViewResolver来选择最适合客户端的表述;
- 借助@ResponseBody注解和各种HttpMethodConverter实现,能够替换基于视图的渲染方式;
- 类似地,@RequestBody注解以及HttpMethodConverter实现可以将传入的HTTP数据转化为传入控制器处理方法的Java对象;
- 借助RestTemplate,Spring应用能够方便地使用REST资源。
16.2 创建第一个REST端点
spring 提供了两种方法用于java到用户的表述转换
- 内容协商(Content negotiation):选择一个视图,它能够将模型渲染为呈现给客户端的表述形式;
- 消息转换器(Message conversion):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式
16.2.1 协商资源表述
内容协商也是一种viewResolver,跟之前渲染页面一样
16.2.2 使用HTTP信息转换器
消息转换(message conversion)提供了一种更为直接的方式,它能够将控制器产生的数据转换为服务于客户端的表述形式。当使用消息转换功能时,DispatcherServlet不再需要那么麻烦地将模型数据传送到视图中。实际上,这里根本就没有模型,也没有视图,只有控制器产生的数据,以及消息转换器(message converter)转换数据之后所产生的资源表述。
Spring提供了多个HTTP信息转换器,我们需要使用@ResponseBody来告知Spring,我们要将返回的对象作为资源发送给客户端,并将其转换为客户端可接受的表述形式
具体转换成哪种格式,跟用户的accept 头部有关
使用@RestController 来合并controller 和responsebody
16.3 提供资源之外的其他内容
16.3.1 发送错误信息到客户端
16.3.2 在响应中设置头部信息
16.4 编写REST客户端
16.4.1 了解RestTemplate的操作
使用RestTemplate来访问http资源
16.4.2 GET资源
16.4.3 检索资源
16.4.4 抽取响应的元数据
16.4.5 PUT资源
16.4.6 DELETE资源
16.4.7 POST资源数据
16.4.8 在POST请求中获取响应对象
16.4.9 在POST请求后获取资源位置
16.4.10 交换资源
16.5 小结
第17章 Spring消息
使用Java消息服务(Java MessageService,JMS)和高级消息队列协议(Advanced Message Queuing Protocol,AMQP)发送和接收消息
异步消息不同于远程调用的同步消息
17.1 异步消息简介
17.1.1 发送消息
分为点对点消息模型和发布订阅消息模型
17.1.2 评估异步消息的优点
17.2 使用JMS发送消息
17.2.1 在Spring中搭建消息代理
指定amq的地址、topic、queue
17.2.2 使用Spring的JMS模板
使用默认的topic、默认的消息转换器,只需要操作jmsoperation即可一键发送消息
使用receiveAndConvert就能接收消息
17.2.3 创建消息驱动的POJO
但是接收消息这个方法调用该写在哪呢?EJB2规范的一个重要内容是引入了消消息息驱驱动动bean(message-driven bean,MDB)
只需要配置jms 的listener即可完成消息接收
17.2.4 使用基于消息的RPC
17.3 使用AMQP实现消息功能
17.3.1 AMQP简介
amqp引入了exchange,消息分发支持direct、fanout、topic、headers四种模式
头顶直扇 头上直直的顶着一把扇子
17.3.2 配置Spring支持AMQP消息
配置连接工厂
17.3.3 使用RabbitTemplate发送消息
convertAndSend
17.3.4 接收AMQP消息
依然可以基于消息驱动来配置
17.4 小结
第18章 使用WebSocket和STOMP实现消息功能
18.1 使用Spring的低层级WebSocket API
18.2 应对不支持WebSocket的场景
18.3 使用STOMP消息
18.3.1 启用STOMP消息功能
18.3.2 处理来自客户端的STOMP消息
18.3.3 发送消息到客户端
18.4 为目标用户发送消息
18.4.1 在控制器中处理用户的消息
18.4.2 为指定用户发送消息
18.5 处理消息异常
18.6 小结
第19章 使用Spring发送Email
19.1 配置Spring发送邮件
19.1.1 配置邮件发送器
19.1.2 装配和使用邮件发送器
19.2 构建丰富内容的Email消息
19.2.1 添加附件
19.2.1 添加附件
19.2.2 发送富文本内容的Emai
l 19.3 使用模板生成Email
19.3.1 使用Velocity构建Email消息
19.3.2 使用Thymeleaf构建Email消息
19.4 小结
第20章 使用JMX管理Spring Bean
20.1 将Spring bean导出为MBean
20.1.1 通过名称暴露方法
20.1.2 使用接口定义MBean的操作和属性
20.1.3 使用注解驱动的MBean
20.1.4 处理MBean冲突
20.2 远程MBean
20.2.1 暴露远程MBean
20.2.2 访问远程MBean
20.2.3 代理MBean
20.3 处理通知
20.3.1 监听通知
20.4 小结
第21章 借助Spring Boot简化Spring开发
简化spring开发、使用
21.1 Spring Boot简介
boot 包含四部分:
- Spring Boot Starter:它将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建 中;
- 自动配置:Spring Boot的自动配置特性利用了Spring 4对条件化配置的支持,合理地推测应用所需的bean并自动化配置它们;
- 命令行接口(Command-line interface,CLI):Spring Boot的CLI发挥了Groovy编程语言的优势,并结合自动配置进一步简化Spring应 用的开发;
- Actuator:它为Spring Boot应用添加了一定的管理特性。
21.1.1 添加Starter依赖
21.1.2 自动配置
21.1.3 Spring Boot CLI
21.1.4 Actuator
21.2 使用Spring Boot构建应用
21.2.1 处理请求
添加spring-boot-starter-web进来,不需要配置serverlet
21.2.2 创建视图
不需要配置viewResolver
21.2.3 添加静态内容
21.2.4 持久化数据
不需要配置连接工厂
21.2.5 尝试运行
21.3 组合使用Groovy与Spring Boot CLI
21.3.1 编写Groovy控制器
21.3.2 使用Groovy Repository实现数据持久化
21.3.3 运行Spring Boot CLI
21.4 通过Actuator获取了解应用内部状况
21.5 小结