开始学习Spring框架
Part.1 Spring框架介绍与入门案例:
1、 搭建Spring HelloWorld项目
a) Spring下载:http://repo.spring.io/release/org/springframework/spring/
b) 导包:(以下5个包称为基本包,根据你使用的版本可能还需导入log4j包,咱们学习的版本暂时无需导入)
i. 核心包:bean、context、core、expression;
ii. 日志包:apache.commons.logging
c) 引入约束:bean约束和引入主配置文件头;
d) 测试:将自定义对象由自己创建交由Spring管理;
2、 SpringIDE - sts插件安装;
a) 下载地址:http://spring.io/tools/sts/all/
b) 安装springIDE;
Spring-IoC | DI概念介绍:(要实现IOC依赖DI的支持)
IoC(Inversion of Control):反转控制:将我们自己创建对象的工作交给Spring容器帮我们完成;
DI(Dependency Injection):依赖注入:将值通过配置的方式为变量初始化/赋值(注入);
c) 注入方式:set方法注入、构造注入、字段注入(不推荐);
d) 注入类型:
i. 值类型(value) – 八大基本数据类型;
ii. 引用类型(ref) – String、自定义对象;
Part.2 Spring配置:
1、 Xml配置
a) Bean元素:交由Spring管理的对象都要配置在bean标签中;
i. Bean标签介绍和创建方式:空参构造、静态工厂、动态工厂;
ii. Scope属性介绍:singleton、protoptype、request、session;
iii. 初始化方法Init-method和 销毁方法destroy-method介绍;
b) 属性注入:
i. Set方法注入;
ii. 构造函数注入;
iii. 复杂类型注入:Array、List、Set、Map、Properties
2、 Spring注解配置;
a) 导包和约束:基本包、aop包+context约束;
b) 将对象注册到容器内;
c) 用注解配置Scope属性;
d) 注解配置init-method与destroy-method;
e) 注解配置属性注入,值类型与引用类型;
3、 Spring & JUnit进行测试:
a) 导包: test包(依赖 aop包);
b) 使用@RunWith注解创建spring容器;
c) 使用@ContextConfiguration读取spring配置文件;
4、 主配置文件的分包配置;
Part.3 小结与练习:将Spring应用到servlet项目中
1、 使用servlet技术开发用户登陆功能;
2、 在项目中加入Spring框架
i. 将service、dao、dateSource交给Spring管理;
ii. 在web.xml中配置Spring监听器和读取配置文件;
Part.4 Spring-aop:
1、 aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切
2、 Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他进行一些设置;
3、 Spring-aop是基于动态代理的 – 优先选用JDKProxy动态代理;
a) Proxy动态代理:被代理的对象必须要实现接口;
b) Cglib动态代理:被代理的对象不能被final修饰,基于继承;
4、 Spring aop相关名词说明 – 详见 表-[Spring术语解释];
5、 Spring aop配置:
a) 导包:
i. 基本包;
ii. spring-aspects和spring-aop ;
iii. aop联盟包 – aopalliance;
iv. aop织入包 - aspectj.weaver;
b) 自定义通知,五种自定义通知类型:
i. before 前置通知
ii. after 最终通知(后置通知)
iii. afterReturning 成功通知(后置通知)
iv. afterThrowing 异常通知(后置通知)
v. around 环绕通知
c) 配置applicationContext.xml:
Part.5 Spring与Jdbc
1、 使用JdbcTemplate操作数据库;
a) 导包:新增jdbc、tx
2、 JdbcTemplate的增删改查操作;
3、 让Spring容器管理JdbcTemplate;
4、 继承JdbcDaoSupport甩开JdbcTemplate;
5、 在Spring中读取配置文件;
Part.6 Spring中的aop事务
1、 事务相关知识:
a) 什么是事务:把多条数据库操作捆绑到一起执行,要么都成功,要么都失败;
b) 事务的原则ACID:
i. 原子性:事务包含的所有操作,要么全部成功,要么全部失败回滚,成功全部应用到数据库,失败不能对数据库有任何影响;
ii. 一致性:事务在执行前和执行后必须一致;例如A和B一共有100块钱,无论A、B之间如何转账,他们的钱始终相加都是100;
iii. 隔离性:多用户并发访问同一张表时,数据库为每一个用户开启新的事务,该事务不能被其他事务所影响,相互有隔离;
iv. 持久性:一个事务一旦提交,则对数据库中数据的改变是永久的,即便系统故障也不会丢失;
c) 并发可能引起的问题:
i. 脏读:一个事务读取到另一个事务未提交的数据;
ii. 不可重复读:一个事务读取到另一个事务已提交(Update操作)的数据,导致前后读取不一致;
iii. 幻读(虚读):一个事务中读取到别的事务插入(Insert操作)的数据,导致前后读取不一致;
d) 事务的隔离级别:根据实际情况选择;
i. Serializable串行化:可避免脏读、不可重复读和幻读;
ii. Repeatable read可重复读:可避免脏读、不可重复读;(MySql默认值)
iii. Read committed读已提交:可避免脏读;
iv. Read uncommitted读未提交:任何情况都无法保证;
2、 Spring-aop事务-搭建环境;
a) 事务基本操作:打开事务、提交事务、回滚事务;
b) Spring中利用接口来管理不同框架的事务操作;
i. 通过实现PlatformTransactionManager接口支持不同的框架完成各自的事务处理;
ii. 为不同平台提供对应的事务管理器的实现:
JDBC&Mybatis:DataSourceTransactionManager;
…
c) Spring-aop事务通过配置事务的隔离级别、事务传播行为、是否只读来操作;
i. 隔离级别:串行化、可重复读、读已提交、读未提交;
ii. 是否只读:
- true:不可改变数据库中的数据,查询操作推荐,
- false:可以改变数据库数据;
iii. 事务传播行为:事务方法嵌套调用的规则:
xService.x(); -> yService.y(); - REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置;
- REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务;
- SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行;
- NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起(暂停);
- MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常;
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常;
- NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与REQUIRED类似的操作。
3、 Spring-aop事务 – 从麻烦的事务代码中走出之xml配置版aop事务;
a) 使用经典的转账案例进行测试,准备数据:bean、service、dao;
b) 使用事务需要额外导入tx包和tx约束;
c) 配置事务核心管理器: DataSourceTransactionManager;
d) 配置事务通知 tx:Advice;
e) 配置aop;
4、 Spring-aop事务 – 从麻烦的事务代码中走出之注解版aop事务。
Part.7 Spring整合Mybatis加入事务操作数据库
1、 整合Mybatis
a) 导包:
i. Spring:基本包、aop、aspects、jdbc、tx、test;
ii. Mybatis:mybatis-3.4.6
iii. 整合包:mybatis-spring-1.3.2
iv. 三方包:
- aopalliance
- aspectj.weaver
- c3p0-0.9.5.2
- mchange-commons-java-0.2.11
- mysql-connector-java-5.1.46-bin
- ojdbc7
b) 创建项目结构(package):bean、service、mapper、test;
c) 创建配置文件:sqlMapperConfig、applicaitonContext
2、 创建测试用例:使用Mapper扫描开发,转账;
3、 在service中加入事务:利用Spring-aop事务解决转账异常问题;
Part.8总结