spring笔记

spring笔记

spring总览

spring框架总体架构

IOC

Inversion of Control,控制反转,DI(Dependency Injection)的一种实现方式,好莱坞原则(Don’t call us, we will call you)恰如其分的表达。

ioc的角色

实现方法

  1. 构造方法注入
  2. setter方法注入
  3. 接口注入

bean的实例化过程

当前用法

1
2
<!-- 扫描通过注解配置的Bean -->
<context:component-scan base-package="io.terminus.pampas.webc,com.vanke.life.web.controller"/>

AOP

Aspect Oriented Programming,面向方面编程。

实现方式

编译器 AspectJ的ajc编译器

  1. 自定义类加载器 AspectJ Werkz
  2. 动态代理 jdk
  3. 动态字节码增强 CGLIB

四个概念

  1. Joinpoint 进行织入操作的执行点
  2. Pointcut Joinpoint的表述方式
  3. Advice 单一横切关注点逻辑的载体,将会织入到Joinpoint的横切逻辑
    1. Before advice
    2. After advice
      1. After returning Advice
      2. After throwing Advice
      3. After (finally) advice
    3. Around advice 拦截器
    4. Introduction 为对象添加新的特性或者行为
  4. Aspect 横切关注点逻辑模块化封装的AOP概念实体

当前用法

1
2
<!-- 开启AOP自动代理 -->
<aop:aspectj-autoproxy/>

JDBC

统一的数据访问异常层次体系

  1. JDBC SQLException是checked exception,然而出现异常客户端是无法有效处理的。
  2. 异常信息不明确,errorCode、sqlState等都有可能成为错误信息的载体。

spring将该异常封装为特定的unchecked exception

spring-jdbc异常层次体系简图

基于JdbcTemplate方式进行数据处理,屏蔽JDBC底层

对各种ORM框架的集成

事务管理 - AOP的实际应用

事务特性

  1. 原子性 Atomicity
  2. 一致性 Consistency
  3. 隔离性 Isolation
    1. Read Uncommited
    2. Read Commited
    3. Repeatable Read
    4. Serializable
  4. 持久性 Durability

隔离性相关的三个问题

  1. 脏读 Dirty Read
  2. 不可重复读取 Non Repeatable Read
  3. 幻读 Phantom Read

事务相关角色

  1. RM Resource Manager 如数据库服务器
  2. TP Monitor Transaction Processing Monitor 在分布式事务场景中协调包含多个RM的事务处理
  3. TM Transaction Manager TP Monitor的核心模块
  4. Application 应用程序

全局事务

如果整个事务处理过程中有多个RM参与,那么久需要引入TP Monitor来协调多个RM之间的事务管理。TP Monitor将采用两阶段提交(Two-Phase Commit)协议来保证整个事务的ACID属性。

全局事务示意图

局部事务

当前事务只有一个RM参与。

局部事务示意图

事务隔离级别

  1. ISOLATION_DEFAULT 使用数据库默认的隔离级别
  2. ISOLATION_READ_UNCOMMITTED 允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读
  3. ISOLATION_READ COMMITTED 允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读
  4. ISOLATION_REPEATABLE_READ 对相同字段的多次读取结果一致,可导致幻读
  5. ISOLATION_SERIALIZABLE 完全服从ACID的原则,确保不发生脏读、不可重复读和幻读

事务传播行为

  1. PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  2. PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
  3. PROPAGATION_MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。
  4. PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
  5. PROPAGATION_NOT_SUPPORTED 以非事务方式执行,如果当前存在事务,就把当前事务挂起。
  6. PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事务。

基于TransactionTemplate编程式事务管理

基于注解、XML配置的申明式事务管理

1
2
3
4
5
6
7
<!-- 事务管理器配置, 使用jdbc事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="writeDataSource"/>
</bean>

<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

Spring MVC

springMvc

springMVC基本架构

springMVC详细架构

MultipartResolver

用于检查当前web请求是否为multipart类型(表单上传文件),是则将当前request装饰为MultipartHttpServletRequest

HandlerMapping

帮助DispatcherServlet进行web请求的URL到具体处理类的匹配,配置HandlerInterceptor。

HandlerInterceptor

在Handler的执行前后对处理流程进行拦截操作。

Handler

处理具体web请求,Controller是最常用类型,处理完成返回ModelAndView。

HandlerAdaptor

Handler适配器,屏蔽不同Handler实现的差异。

HandlerExceptionResolver

处理在Handler查找及Handler执行期间发生的异常,同样返回ModelAndView。

ModelAndView

包含View相关信息,以及模型数据。

ViewResolver

从ModelAndView中解析出可用的View

LocalResolver

国际化支持

ThemeResolver

主题支持

View

视图渲染

模板工作原理

对J2EE服务的集成和支持

对JNDI的支持

Java Naming and Directory Interface。提供JndiTemplate模板

1
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/xuheSource"/>

对JMS的支持

  1. 点对点模式,Point-to-Point
  2. 发布订阅模式,Publish/Subscribe

提供JmsTemplate模板

spring远程方案

统一风格的远程服务公开与访问方式,提供对RMI、RPC、Http invoker、Caucho Hessian、Caucho Burlap、JMS、JMX、CXF(Apache Web Service服务框架)的支持。

springRemoting远程交互示意图

springRemoting远程调用实现结构示意图