spring笔记
spring总览
IOC
Inversion of Control,控制反转,DI(Dependency Injection)的一种实现方式,好莱坞原则(Don’t call us, we will call you)恰如其分的表达。
实现方法
- 构造方法注入
- setter方法注入
- 接口注入
当前用法
1 | <!-- 扫描通过注解配置的Bean --> |
AOP
Aspect Oriented Programming,面向方面编程。
实现方式
编译器 AspectJ的ajc编译器
- 自定义类加载器 AspectJ Werkz
- 动态代理 jdk
- 动态字节码增强 CGLIB
四个概念
- Joinpoint 进行织入操作的执行点
- Pointcut Joinpoint的表述方式
- Advice 单一横切关注点逻辑的载体,将会织入到Joinpoint的横切逻辑
- Before advice
- After advice
- After returning Advice
- After throwing Advice
- After (finally) advice
- Around advice 拦截器
- Introduction 为对象添加新的特性或者行为
- Aspect 横切关注点逻辑模块化封装的AOP概念实体
当前用法
1 | <!-- 开启AOP自动代理 --> |
JDBC
统一的数据访问异常层次体系
- JDBC SQLException是checked exception,然而出现异常客户端是无法有效处理的。
- 异常信息不明确,errorCode、sqlState等都有可能成为错误信息的载体。
spring将该异常封装为特定的unchecked exception
基于JdbcTemplate方式进行数据处理,屏蔽JDBC底层
对各种ORM框架的集成
事务管理 - AOP的实际应用
事务特性
- 原子性 Atomicity
- 一致性 Consistency
- 隔离性 Isolation
- Read Uncommited
- Read Commited
- Repeatable Read
- Serializable
- 持久性 Durability
隔离性相关的三个问题
- 脏读 Dirty Read
- 不可重复读取 Non Repeatable Read
- 幻读 Phantom Read
事务相关角色
- RM Resource Manager 如数据库服务器
- TP Monitor Transaction Processing Monitor 在分布式事务场景中协调包含多个RM的事务处理
- TM Transaction Manager TP Monitor的核心模块
- Application 应用程序
全局事务
如果整个事务处理过程中有多个RM参与,那么久需要引入TP Monitor来协调多个RM之间的事务管理。TP Monitor将采用两阶段提交(Two-Phase Commit)协议来保证整个事务的ACID属性。
局部事务
当前事务只有一个RM参与。
事务隔离级别
- ISOLATION_DEFAULT 使用数据库默认的隔离级别
- ISOLATION_READ_UNCOMMITTED 允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读
- ISOLATION_READ COMMITTED 允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读
- ISOLATION_REPEATABLE_READ 对相同字段的多次读取结果一致,可导致幻读
- ISOLATION_SERIALIZABLE 完全服从ACID的原则,确保不发生脏读、不可重复读和幻读
事务传播行为
- PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED 以非事务方式执行,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事务。
基于TransactionTemplate编程式事务管理
基于注解、XML配置的申明式事务管理
1 | <!-- 事务管理器配置, 使用jdbc事务 --> |
Spring MVC
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的支持
- 点对点模式,Point-to-Point
- 发布订阅模式,Publish/Subscribe
提供JmsTemplate模板
spring远程方案
统一风格的远程服务公开与访问方式,提供对RMI、RPC、Http invoker、Caucho Hessian、Caucho Burlap、JMS、JMX、CXF(Apache Web Service服务框架)的支持。