前言:本文档是本人自学Spring时候手动码的,里边参考了各路大神的文章,我做了一个系统的整合。好好学习,共同进步!!
一、Spring介绍
1.Spring的作用
Spring负责项目中的所有对象,可以看做是项目对象的管家。正是因为Spring框架是属于容器性质的,容器中装 什么对象就有什么功能,所以可以一站式开发。不仅不排斥其他框架,还能帮助其他框架管理对象。
2.Sping中所用到的思想
Aop:面向切面编程,利用aop可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑之间的耦合度降低,提高程序的可重用性。
Ioc:反转控制,减低代码耦合度,最常见的方式叫依赖注入。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
3.Sping Jdbc
相对于传统的jdbc实现,在jdbc API的基础上封装了一套JdbcTemplate,JdbcTemplate。优点如下:
- 配置基于模板设置
- 完成了资源创建和释放的工作
- 完成了对jdbc的核心流程的工作,包括sql语句的创建和执行,简化了jdbc操作
- 仅需要传递DataSource就可以把它实例化
- JdbcTemplate只需要创建一次
- JdbcTemplate是线程安全的
例如:
<!-- 创建jdbcTemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"> </property>
</bean>
4.Spring aop事务
事务:必须遵循4个原则,ACID
A:Automicity,原子性,强调事务作为原子级别已经不可以再被分割,要么成功要么失败。
C:Consistency,一致性,状态转换必须是由一种正确的状态转换到另外一种正确的状态。
I:IsoIation,隔离性,即相互间必须不能被影响。
D:Durability,持久性,即事务提交后将被永久保存,即便出现其他故障,事务处理结果也应得到保存。
事务的作用:对企业级应用至关重要,保证每一次操作都是可靠的,即使出现异常,也不至于破坏后台数据的完整性。
并发下事务会产生的问题:
脏读:事务A读到了事务B还没有提交的数据.A和B都取钱,A先开启事务,此时B也开启事务取走100快,没有提交,此时数据库还没更新,事务A读取的肯定是数据库里边的原始数据。这就是脏读。
不可重复读:在一个事物里读取了两次某个数据,读出来的数据不一致。事物A开启事务,查出银行卡余额为1000快。此时事务B开启事务,取走100,并提交,里边余额变为900.此时切回事务A,再查一次查出账户余额为900。这样对A而言,在用一个事务内两次读取账户余额不一致,就是不可重复读。
幻读:在一个事物里边的操作发现了未被操作的数据。比如学生信息,事务A开启事务,修改学生的出勤情况为false,此时切换到事务B,事务B开启事务->插入 一条学生数据,此时切换到事务A,发现一条未被自己修改过的数据,这就是幻读,跟发生了幻觉一样。
事务的隔离级别,Spring提供了5种:
- DEFAULT 默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事物时将isolation设置为DEFAULT的话,将使用数据库的默认隔离级别。
- READ_UNCOMMITTED读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用。
- READ_COMMITED 读已提交,即能够读取那些已经提交的数据,能够防止脏读,但是无法避免不可重复读和幻读。
- REPEATABLE_READ重复读取,即在数据读出来之后加锁,类似"select * from XXX for update"。明确数据读取出来是为了更新用的,所以要加一把锁,防止别人修改。也类似于,读取了一条数据,这个事物不结束,别的事物就不可以改这条记录。这样就解决了脏读,不可重复读,但是幻读还是没有解决。
- SERLALIZABLE 串行化,事务的最高隔离级别,不管多少事务,挨个运行完所有的子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读、幻读的问题。
5.Spring junit测试支持
(1)导入spring-test-3.2.0.RELEASE.jar
(2)添加依赖包 项目右键单击BuildPath>AddLibrary>JUnit 选JUnit4 完成.
(3)创建测试类
import org.junit.Test;import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.level.service.TestService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")//加载spring容器配置文件public class TestJUnit {
@Autowired
private TestService testService;
@Test
public void test(){
testService.save();
}
}