IOC,AOP,Spring事务,SpringMvc基础知识理解----学习笔记(四)

Spring IOC
IOC理念
(基于反射技术)
不采用new方法,而是使用一种描述方式,每个U盘都有自己的一段描述,通过接口我们可以读入这些信息,根据这些信息可以注入对应的U盘驱动.这样我们在维护源码的时候只需要去描述这些信息,并且提供服务即可,而不需要去修改源码了.
Spring中注入资源往往是通过描述(注解或者XML描述)来实现的,包括构造方法注入,setter注入,接口注入
<bean id="**" class="**"><!-- 构造注入 -->
  <constructor-args index='0' value='**'/>
  <constructor-args index='1' value='**'/>
</bean>

<bean id="**" class="**"> <!-- setter注入 -->
  <property name='id' value='**'/>
  <property name='name' value='**'/>
</bean>

Spring接口注入是一种注入其他服务的接口,比如JNDI数据源注入,在Tomcat或者其他服务器中往往配置了JNDI数据源,那么就可以使用接口注入我们需要的资源,如:
<bean id="dataSource" class='org.springframework.jndi.JndiObjectFactoryBean'>
  <property name='jndiName'>
    <value>java:comp/env/jdbc/mybatis</value>
  </property>
</bean>

AOP(基于动态代理技术)
切点:什么样的方法被拦截,拦截规则,通过正则式匹配
切面:方法里实现什么功能,具体方法
连接点:在什么地方加Log,(Before advice,After advice,After return advice,After throwing advice)

Spring事务管理(通过AOP实现的)
脏读:一个事务读取到另外一个事务未提交的数据
A事务正在写的数据但没有提交,被B事务读取到
不可重复读:在同一个事务中,多次读取同一数据返回的结果不一样
A事务两次读取同一数据之间,B事务做了修改并提交
幻读:一个事务读取到另一个事务的insert数据
A事务两次读取同一数据之间,B事务做了添加了新的数据记录

一致性:强一致性,类似加锁,保证能看到系统内的所有更改,一个事务单元要保证全部成功之后才对别的事务可见.

隔离性以性能为理由,对一致性的破坏
序列化:串行,(读和写都串行)(性能差)(排它锁)
可重复读:读锁不能被写锁升级,也即(读读并行,写写串行,读写和写读也串行)(幻读)(读写锁)
读已提交:写锁可以被读锁升级,也即(读读并行,写写串行,读写并行,写读不能并行,即先读后写,后面的写可以升级为读锁)(读写并行,故有可能读到后面写的数据,不可重复读\幻读)(读写锁)
读未提交:只加写锁,读不加锁,也即(读读并行,写写串行,读写和写读都并行)(读没有锁,可能读到没有提交的数据,脏读\不可重复读\幻读)(写锁)

理解:写指的是修改数据,写入,读和写都是一个事务

关于事务可以参考,Spring事务介绍

事务隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读,幻读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED)
读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化

MYSQL: 默认为REPEATABLE_READ
SQLSERVER: 默认为READ_COMMITTED

事物传播行为介绍: 
@Transactional(propagation=Propagation.REQUIRED) 
有事务, 加入事务, 没有则新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) 
不开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW) 
始终创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY) 
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER) 
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) 
其他bean调用这个方法时,在其他bean中有事务,就用事务.没有声明事务,就不用事务.

@Transactional(propagation=Propagation.NESTED)
如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有事务则按REQUIRED属性执行. 

猜你喜欢

转载自blog.csdn.net/lovewebeye/article/details/79901290