目录

  • Spring的核心
  • 第2章 装配bean
  • 2.1 Spring配置的可选方案
  • 第3章 高级装配
  • 3.1 环境与profile
  • 3.1.1 配置profile bean
  • 3.1.2 激活profile
  • 3.2 条件化的bean
  • 3.3 处理自动装配的歧义性
  • 3.3.1 标示首选的bean
  • 3.3.2 限定自动装配的bean
  • 3.4 bean的作用域
  • 3.5 运行时值注入
  • 3.5.1 注入外部的值
  • 3.5.2 使用SpEL
  • 4.面向切面的Spring
  • 4.3 使用注解创建切面
  • 4.3.2 创建环绕通知
  • 4.3.3 处理通知中的参数
  • 4.3.4 通过注解引入新功能
  • 4.4 在XML中声明切面
  • 4.4.1 声明前置和后置通知
  • 4.4.2 声明环绕通知
  • 4.4.3 为通知传递参数
  • 4.4.4 通过切面引入新的功能
  • 5.构建Spring Web应用程序
  • 5.1Spring MVC起步
  • 5.1.1 跟踪Spring MVC的请求
  • 5.1.2 搭建Spring MVC
  • 5.2 编写基本的控制器
  • 5.2.2 定义类级别的请求处理
  • 5.2.3 传递模型数据到视图中
  • 5.3 接收请求的输入
  • 5.3.1 处理查询参数
  • 5.3.2 通过路径参数接受输入
  • 5.4 处理表单
  • 5.4.2 校验表单
  • 6 渲染Web视图
  • 6.1 理解视图解析
  • 6.2 创建JSP视图
  • 6.2.1 配置适用于JSP的视图解析器
  • 6.2.2 使用Spring的JSP库
  • 7.Spring MVC的高级技术
  • 7.1 Spring MVC配置的替代方案
  • 7.1.3 在web.xml中声明DispatcherServlet
  • 12.3 使用Redis操作key-value数据
  • 12.3.1 连接到Redis
  • 12.3.2 使用RedisTemplate
  • 12.3.3 使用key和value的序列化器


Spring的核心

  1. DI

松耦合。一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。

  1. AOP
    AOP允许把遍布应用各处的功能分离出来形成可重用的组件
  • 实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现.即使你把这些关注点抽象为一个独立的模块,其他模块只是调用它的方法,但方法的调用还是会重复出现在各个模块中。
  • 组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何添加地址,而不应该关注它是不是安全的或者是否需要支持事务。

spring实战 第四版 spring实战第四版mobi_spring

AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。总之,AOP能够确保POJO的简单性。

  1. 使用模板消除样板式代码
  2. 激发POJO的潜能
    一个简单普通的Java类一POJO。 没有任何地方表明它是一个Spring组件。Spring的非侵入编程模型意味着这个类在Spring应用和非Spring应用中都可以发挥同样的作用。

第2章 装配bean

2.1 Spring配置的可选方案

  • 在XML进行显式配置
  • 在Java中进行显式配置
  • 隐式的bean发现机制和自动装配
  1. 隐式的bean发现机制和自动装配
  • 组件扫描
  • 自动装配
  1. 通过Java代码装配bean
  2. 通过XML装配bean
    构造器注入
  • 元素
  • 使用Spring3.0所引入的c-命名空间
    在装配bean引用和字面量值方面,和c-命名空间的功能是相同的。但是c-命名空间的属性无法实现装配集合的功能。

属性注入


  • p-命名空间
    同样,p=命名空间一样不能装配集合。可以使用util-命名空间来简化注入
  1. 导入和混合配置
    @Import 将两个配置类组合到一起
    @ImportResource让Spring同时加载xml配置和其他基于Java的配置
    元素导入其他的XML配置文件,元素可以将Java配置导入到XML配置中

第3章 高级装配

3.1 环境与profile

3.1.1 配置profile bean

配置中,在Spring3.1中,只能在类级别上使用@Profile注解。不过,从Spring3.2开始,方法级别上也可以使用,与@Bean一同使用

XML中配置,通过<beans>元素的profile属性配置
3.1.2 激活profile
  • 作为DispatcherServlet的初始化参数;
  • 作为Web应用的上下文参数;
  • 作为JNDI条目;
  • 作为环境变量;
  • 作为JVM的系统属性;
  • 在集成测试类上,使用@ActiveProfiles注解设置。

Spring提供了@ActiveProfiles注解,可以使用它来指定运行测试时要激活哪个profile

3.2 条件化的bean

@Conditional 此注解将会通过Condition接口进行条件对比

3.3 处理自动装配的歧义性

3.3.1 标示首选的bean

配置类@Primary XML:primary属性

3.3.2 限定自动装配的bean

@Qualifier 可以与@Autowired和@Inject协同使用 也可以创建自定义的限定符注解

3.4 bean的作用域

  • 单例(Singleton) :在整个应用中,只创建bean的一个实例。
  • 原型(Prototype) :每次注入或者通过Spring应用上下文获取的时候,都会创建-个新的bean实例。
  • 会话(Session) :在Web应用中,为每个会话创建一个bean实例。
  • 请求(Rquest) :在Web应用中,为每个请求创建一个bean实例。

单例是默认的作用域,如果选择其他的作用域,要使用@Scope注解,可以与@Component和@Bean注解一起使用。XML中通过元素的scope属性来设置作用域

3.5 运行时值注入

Spring提供了两种在运行时求值的方式:

  • 属性占位符 (Property placeholder)
  • Spring表达式语言(SpEL)
3.5.1 注入外部的值
  • @PropertySource和Environment
  • 占位符装配属性
    XML c:_title = “${}” 组件扫描和自动装配:@Value(),为了使用占位符,配置一个PropertyPl aceholderConfigurer bean或者PropertySourceholderConfigurer bean,其中第二种能够基于Spring Environment及其属性源来解析占位符。XML中 context命名空间
    <context: propertysourceholder>
3.5.2 使用SpEL

SpEL拥有很多特性,包括:

  • 使用bean的ID来引用bean;
  • 调用方法和访问对象的属性;
  • 对值进行算术、关系和逻辑运算;
  • 正则表达式匹配;
  • 集合操作。

4.面向切面的Spring

Spring基于动态代理,所以Spring只支持方法连接点。

4.3 使用注解创建切面

spring实战 第四版 spring实战第四版mobi_XML_02

@Pointcut注解能够在一个@AspectJ切面内定义可重用的切点

例子:

spring实战 第四版 spring实战第四版mobi_MVC_03

在配置类的类级别上通过使用@EnableAspectJAutoProxy注解启用自动代理功能

例子:

spring实战 第四版 spring实战第四版mobi_XML_04

在XML中,通过Spring aop命名空间中的<aop: aspectj-autoproxy>元素。

例子:

spring实战 第四版 spring实战第四版mobi_后端_05

4.3.2 创建环绕通知
4.3.3 处理通知中的参数

spring实战 第四版 spring实战第四版mobi_MVC_06

4.3.4 通过注解引入新功能

给被代理对象添加新的方法

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_07

@DeclareParents

4.4 在XML中声明切面

spring实战 第四版 spring实战第四版mobi_MVC_08


spring实战 第四版 spring实战第四版mobi_后端_09

4.4.1 声明前置和后置通知
4.4.2 声明环绕通知

如果不使用成员变量存储信息的话,在前置通知和后置通知间共享信息非常麻烦,而环绕通知在这点上有明显的优势。

4.4.3 为通知传递参数
4.4.4 通过切面引入新的功能

<aop: declare-parents>

spring实战 第四版 spring实战第四版mobi_spring_10

或者

spring实战 第四版 spring实战第四版mobi_spring_11


spring实战 第四版 spring实战第四版mobi_后端_12

5.构建Spring Web应用程序

5.1Spring MVC起步

5.1.1 跟踪Spring MVC的请求

spring实战 第四版 spring实战第四版mobi_MVC_13

5.1.2 搭建Spring MVC

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_14

启用Spring MVC

最简单的Spring MVC配置是一个带有@EnableWebMvc注解的类

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_15

这可以运行,但是有问题:

  • 没有配置视图解析器。如果这样的话. Spring默认会使用BeanNameView-Resolver,这个视图解析器会查找ID与视图名称匹配的bean,并且查找的bean要实现View接口,它以这样的方式来解析视图。
  • 没有启用组件扫描。这样的结果就是,Spring只能找到显式声明在配置类中的控制器。
  • 这样配置的话, DispatcherServlet会映射为应用的默认Servlet,所以它会处理所有的请求,包括对静态资源的请求,如图片和样式表(在大多数情况下,这可能并不是你想要的效果)。

加上一些内容,解决上诉问题:

spring实战 第四版 spring实战第四版mobi_后端_16

RootConfig:

spring实战 第四版 spring实战第四版mobi_XML_17

5.2 编写基本的控制器

控制器是方法上添加@RequestMapping注解的类

5.2.2 定义类级别的请求处理

spring实战 第四版 spring实战第四版mobi_MVC_18

在这个新版本的HomeController中,路径现在被转移到类级别的@RequestMapping上,而HTTP方法依然映射在方法级别上。当控制器在类级别上添加@Reques tMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@Reques tMapping的声明进行补充。
就HomeController而言,这里只有一个控制器方法。与类级别的@Request-Mapping合并之后,这个方法的@RequestMapping表明home ()将会处理对“/路径的GET请求。

5.2.3 传递模型数据到视图中

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_19

5.3 接收请求的输入

5.3.1 处理查询参数

对于针对/spittles?max=238900$count=50 的请求:

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_20

加上默认值:

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_21

5.3.2 通过路径参数接受输入

针对 /spittles/12345 的请求我们可以看到,spittle ()方法的spittleId参数上添加了@PathVariable (“spittleId”)注解,这表明在请求路径中,不管占位符部分的值是什么都会传递到处理器方法的spittleId参数中。如果对“/spittles/54321"发送GET请求,那么将会把“54321"传递进来,作为spittleId的值。

spring实战 第四版 spring实战第四版mobi_spring_22

需要注意的是:在样例中spittleId这个词出现了好几次:先是在@Reques tMapping的路径中,然后作为@PathVariable属性的值,最后又作为方法的参数名称。因为方法的参数名碰巧与占位符的名称相同,因此我们可以去掉@PathVariable中的value属性:

spring实战 第四版 spring实战第四版mobi_MVC_23

5.4 处理表单

5.4.2 校验表单

Java校验API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有的注JAVA校验API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有的注解都位于j avax. validation. constraints包中。表5.1列出了这些校验注解。解都位于j avax. validation. constraints包中。表5.1列出了这些校验注解。

6 渲染Web视图

6.1 理解视图解析

Spring MVC定义了一个ViewResolver接口

spring实战 第四版 spring实战第四版mobi_MVC_24

返回一个View实例。View是另一个接口

spring实战 第四版 spring实战第四版mobi_后端_25

Spring自带了13个视图解析器

6.2 创建JSP视图

Spring提供了两种支持JSP视图的方式:

  • InternalResourceViewResolver会将视图名解析为JSP文件。另外,如果在你的JSP页面中使用了JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)的话, InternalResourceViewResolver能够将视图名解析为JstlView形式的JSP文件,从而将JSTL本地化和资源bundle变量暴露给JSTL的格式化(formatting)和信息(message)标签。
  • Spring提供了两个JSP标签库,- - 个用于表单到模型的绑定,另- -个提供了通用的工具类特性。
6.2.1 配置适用于JSP的视图解析器

使用@Bean注解时,配置InternalResourceViewResolver:

spring实战 第四版 spring实战第四版mobi_后端_26

XML的Spring配置:

spring实战 第四版 spring实战第四版mobi_spring_27

解析JSTL视图时候,只需要设置viewClass属性即可。

6.2.2 使用Spring的JSP库

7.Spring MVC的高级技术

7.1 Spring MVC配置的替代方案

7.1.3 在web.xml中声明DispatcherServlet

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_28

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_29


spring实战 第四版 spring实战第四版mobi_MVC_30


spring实战 第四版 spring实战第四版mobi_spring_31

12.3 使用Redis操作key-value数据

12.3.1 连接到Redis

Redis连接工厂会生成到Redis数据库服务器的连接。Spring Data Redis为四种Redis客户端实现提供了连接工厂:

  • Jedi sConnectionFactory
  • Jredi sConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

配置连接工厂为Spring中的bean:

spring实战 第四版 spring实战第四版mobi_XML_32

通过默认构造器创建的连接工厂会向localhost的6379端口创建连接,并且没有密码。如果Redis服务器运行在其他的主机或端口上,在创建连接工厂的时候,可以设置这些属性:

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_33

类似地,如果你的Redis服务器配置为需要客户端认证的话,那么可以通过调用setPassword ()方法来设置密码:

spring实战 第四版 spring实战第四版mobi_spring实战 第四版_34

有了Redis连接工厂,接下来可以使用Spring Data Redis模板

12.3.2 使用RedisTemplate

保存信息:

spring实战 第四版 spring实战第四版mobi_spring_35

获取之前存储的信息:

spring实战 第四版 spring实战第四版mobi_MVC_36

有了RedisConnectionFactory后,构建RedisTemplate:

spring实战 第四版 spring实战第四版mobi_spring_37


spring实战 第四版 spring实战第四版mobi_后端_38


spring实战 第四版 spring实战第四版mobi_后端_39

12.3.3 使用key和value的序列化器