Spring
介绍
概述
- 分层的 Java 一站式轻量级开源框架
- 控制反转 (IoC)
- 面向切面编程(AOP)
优点
- 非侵入式设计
- 降低耦合性,方便开发
- 支持 AOP 编程
- 支持声明式事务
- 方便程序测试
- 方便集成各种框架
- 降低 JavaEE API 的使用难度
体系结构
-
核心容器
- Bean
- Core
- Context
- SpEL
-
数据访问及集成
- JDBC
- ORM
- OXM
- JMS
- Transactions
-
Web
- WebSocket
- Servlet
- Web
- Portlet
-
其他模块
- AOP
- Aspects
- Instrumentation
- Messaging
- Test
Spring 5 新特性
- 更新 JDK 基线
- 修订核心框架
- 更新核心容器
- 支持响应式编程
- 支持函数式 Web 框架
- 支持 Kotlin
- 提升测试功能
目录结构
-
docs
- 开发指南,API 参考文档,…
-
libs
- 开发所需的 JAR 包和源码
-
schema
- 各种配置文件的 XML schema 文档
-
外部依赖:commons.logging
控制反转与依赖注入
控制反转
- 对象实例的控制权由应用代码转移到了 IoC 容器,控制权发生了反转。
依赖注入
-
IoC 容器在运行期间动态的将某种依赖资源注入到对象中。
-
类型
- 构造方法注入
- 属性 setter 方法注入
IoC 容器
BeanFactory 接口
- Spring 容器最基本的接口
- 实现类:XmlBeanFactory
ApplicationContext 接口
-
建立在 BeanFactory 接口基础之上
-
额外功能:国际化,资源访问,事件传播
-
可以为单例的 Bean 实行预初始化
-
实现类
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- AnnotationConfigApplicationContext
- WebApplicationContext
- ConfigurableWebApplicationContext
Bean 的配置
-
格式
- XML
- Properties
-
XML 配置
-
<beans>
-
<bean>
-
id
-
name
-
class
-
scope
-
factory-method
-
factory-bean
-
autowire
-
<constructor-arg>
- index
- type
- ref | <ref>
- value | <value>
-
<property>
-
name
-
ref
-
value
-
<list>
-
<set>
-
<map>
-
<entry>
- key(字符串类型)
- value-ref | <ref>
- value | <value>
-
-
-
-
default-autowire
-
-
Bean 的实例化
- 构造方法实例化
- 静态工厂实例化
- 实例工厂实例化
Bean 的作用域
-
singleton(默认)
- 管理 Bean 的生命周期
-
prototype
-
request
-
session
-
global session
Bean 的装配方式
-
基于 XML
- 属性 setter 方法注入
- 构造方法注入
-
基于注解
- 在配置文件 applicationContext.xml 中开启相应的注解处理器
- @Component
- @Controller
- @Service
- @Repository
- @Scope
- @Value
- @Autowired
- @Resource
- @Qualifier
- @PostConstruct
- @PreDestroy
-
自动装配
- no(默认值)
- default
- byName
- byType
- constructor
Bean 的生命周期
-
实例初始化后
-
实例销毁前
-
监控
- XML 配置文件
- 注解
AOP
介绍
-
概述
- 将程序中相同的业务逻辑进行横向切割,并将重复的业务逻辑抽取到一个独立的模块中,以达到提高程序可用性和开发效率的目的。
-
术语
-
切面(Aspect)
- 用于横向插入系统的功能类
-
连接点(Joinpoint)
- 程序执行过程中某个特定的节点
-
切入点(Pointcut)
- 满足预先指定条件的连接点
-
通知/增强处理(Advice)
- 插入的切面程序代码,是切面的具体实现
-
目标对象(Target)
- 被插入切面的方法
-
织入(Weaving)
- 将切面代码插入到目标对象上,从而生成代理对象的过程
-
代理(Proxy)
- 将通知应用到目标对象后,程序动态创建的通知对象
-
引介(Introduction)
- 一种特殊的通知,为目标对象添加一些属性和方法
-
实现机制
-
JDK 动态代理
- java.lang.reflect.Proxy.newProxyInstance()
-
CGLib 动态代理
- 不要求目标类实现接口
- Spring 核心包已集成 CGLib 所需的包
- org.springframework.cglib.proxy.Enhancer
基于 XML 的 AOP 实现
-
<aop:config>
-
id
-
ref
-
<aop:aspect>
- pointcut
- pointcut-ref
- method
- throwing
- returning
-
<aop:advisor>
-
<aop:pointcut>
-
id
-
expression
- execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
-
-
<aop:before>
-
<aop:after>
-
<aop:around>
-
<aop:after-returning>
-
<aop:after-throwing>
-
基于注解的 AOP 实现
- @Aspect
- @Pointcut
- @Before
- @After
- @Around
- @AfterReturning
- @AfterThrowing
- 开启 @aspectj 的自动代理支持
注意
-
相关依赖
- aspectjrt
- aspectjweaver
-
JoinPoint 接口实例作为参数来获得目标对象的类名和目标方法名
-
ProceedingJoinPoint 接口实例作为参数来获得目标对象的目标方法参数
-
环绕通知必须接收一个类型为 ProceedingJoinPoint 的参数,返回值也必须是 Object 类型,且必须抛出异常
JDBC
JdbcTemplate 概述
-
模板类
-
更高层次的抽象均在此之上
-
继承:JdbcAccessor
-
DataSource
-
SQLExceptionTranslator(接口)
- 负责对 SQLException 异常进行转译
-
-
实现:JdbcOperations
JDBC 的配置
-
模块
- core
- dataSource
- object
- support
-
配置文件 applicationContext.xml 中
-
配置数据源
- org.springframework.jdbc.datasource.DriverManagerDataSource
-
配置 JDBC 模板
- org.springframework.jdbc.core.JdbcTemplate
-
配置注入类
-
注意
- 配置 JdbcTemplate 时,需要将 dataSource 注入 JdbcTemplate 中
- 其他需要使用 JdbcTemplate 的 Bean,也需要将 JdbcTemplate 注入该 Bean 中。
-
-
dataSource
- driverClassName
- url
- username
- password
JdbcTemplate 的常用方法
- execute()
- update()
- query()
事务管理概述
-
核心接口
-
依赖包:spring-tx
-
PlatformTransactionManager
-
用于管理事务
-
getTransaction()
-
commit()
-
rollback()
-
实现类
- DataSourceTransactionManager
-
-
TransactionDefinition
-
定义事务描述相关的常量
-
事务的隔离级别
- 默认
- 读—未提交(脏读,幻读,不可重复读)
- 读—已提交(幻读,不可重复读)
- 允许重复读(MySQL 默认隔离级别)
- 事务串行执行
-
事务的传播行为
-
事务的超时时间
-
是否为只读事务
-
方法:获取事务的属性
-
-
TransactionStatus
- isNewTransaction()
- hasSavepoint()
- isRollbackOnly()
- setRollbackOnly()
- isCompleted()
- flush()
-
-
事务管理的方式
-
编程式
- 通过编写代码实现的事务管理
-
声明式
- 通过 AOP 实现的事务管理
-
-
相关依赖
- aspectjweaver
- aopalliance
声明式事务管理
-
XML 方式
-
引入 tx 命名空间
-
<tx:advice>
-
id
-
transaction-manager
-
<tx:attributes>
-
<tx:method>
- name
- propagation
- isolation
- read-only
- timeout
- rollback-for
- no-rollback-for
-
-
-
-
注解方式
-
@Transactional
- value
- propgation
- isolation
- timeout
- readonly
- rollbackFor
- rollbackForClassName
- noRollbackFor
- noRollbackForClassName
-
类上
- 该类的所有 public 方法都将具有同样类型的事务属性
-
类中的方法上
- 若类上也有该注解,屏蔽掉类上的
-
注意:配置事务注解驱动
-