首页 > 代码库 > Ioc的理解和事务管理器
Ioc的理解和事务管理器
1、依赖注入的概念
spring的两个核心概念:一个是控制反转IoC,也可以叫做依赖注入DI。还有一个是面向切面编程AOP。
控制反转:当某个java对象需要(依赖)另一个java对象时,不是自身直接创建依赖对象,而是由实现IoC的容器(如spring框架的IoC容器)来创建,并将它注入需要这个依赖对象的java对象中。
2、spring的依赖注入
2.1、构造器注入
<bean id="accoutDaoImpl"class="cn.csdn.dao.AccoutDaoImpl" scope=”singleton”/>
<bean id="accoutServicImpl"class="cn.csdn.service.AccoutServicImpl" scope=”">
<!-- 构造器注入方式-->
<constructor-argref="accoutDaoImpl"/></bean>
2.2、设值(set方法)注入
<bean id="accountDaoImpl"class="cn.csdn.dao.AccoutDaoImpl"/>
<bean id="accoutServicImpl"class="cn.csdn.service.AccoutServicImpl">
<!-- 设值(set方法)注入 -->
<property name="accountDaoImpl"ref="accoutDaoImpl"/> </bean>
3、spring的容器
spring管理的基本单元是Bean,在spring的应用中,所以的组件都是一个个的Bean,它可以是任何的java对象。spring负责创建这些Bean的实例。并管理生命周期。而spring框架是通过其内置的容器来完成Bean的管理的,Bean在spring的容器中生存着,使用时只需要通过它提供的一些方法从其中获取即可。
spring的容器有两个接口:BeanFactory和ApplicationContext 这两个接口的实例被陈为spring的上下文。
ApplicationContext ac = new ClassFathXmlApplicationContext("app*.xml");
AccountService accountService = (AccountService)ac.getBean("accountServiceImpl");
4、使用xml装配Bean
4.1、自动装配
no:不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。
<bean id="bean1"class="cn.csdn.service.Bean1" scope="singleton">
<property name="studentDaoImpl"ref="studentDaoImpl">
</property></bean>
备注:有property属性 指定ref
byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为byname,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
<bean id="bean1"class="cn.csdn.service.Bean1" scope="singleton"autowire="byName"/>
备注:没有property属性
byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。
备注:spring3.0以上不抛异常。
4.4、指定Bean的存在范围
singleton:在每个Spring IoC容器中一个bean定义对应一个对象实例。这是默认值
prototype:每次对Bean请求时都会创建一个Bean定义对应一个实例。一个Bean定义多个实例。
request:在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global_session:在一个全局的HTTP Session中,一个bean定义对应一个实例。
典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
4.5、指定Bean的初始化和销毁
Spring可以管理Bean实例在实例化结束之后和被销毁之前的行为。通过property的init-method属性可以指定某个方法应该在Bean全部依赖关系设置结束后自动执行;通过property的destroy-method属性可以指定某个方法应该在Bean被销毁之前自动执行。
4.6、装配Bean的继承
如果两个Bean的属性装配信息很相似,那么可以利用继承来减少重复的配置工作。
<!-- 装配Bean的继承父类作为模板,不需要实例化,设置abstract=”true”-->
<bean id=”parent” class=”cn.csdn.service.Parent”abstract=”true”>
<property name=”name” value=http://www.mamicode.com/”z_xiaofei168”/>
<property name=”pass”value=http://www.mamicode.com/”z_xiaofei168”/>
<!-- 装配Bean的继承子类中用parent属性指定父类标识或别名子类可以覆盖父类的属性装配,也可以新增自己的属性装配-->
<bean id=”child” class=”cn.csdn.service.Chlid”parent=”parent”>
<property name=”pass” value=http://www.mamicode.com/”123123”/>
<propertyname=”age” value=http://www.mamicode.com/”22”/>
spring的事务管理器
Spring框架并没有直接管理用户的应用系统中的事务,它只是提供许多供用户选择的事务管理器,然后将事务管理的责任委托给与此事务管理器对应的持久化技术的事务实现。
事务管理实现 | 使用时机 |
org.springframework.jdbc.datasource. DataSourceTransactionManager | 在单一的JDBC DataSource中管理事务 |
org.springframework.orm.hibernate3. HibernateTransactionManager | 当持久化机制是Hibernate时,用它来管理职务 |
org.springframework.orm. jpa.JpaTransactionManager | 当JPA用作持久化时,用它来管理职务 |
org.springframework.transaction. jta.JtaTransactionManager | 使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用 |
事务属性介绍
1>.传播行为(7个)
传播行为 | 说明 |
PROPAGATION_REQUIRED | 必须在一个事务中执行。如果当前有一个事务正在进行,该方法将会在那个事务中执行。否则要开始一个新事务。Spring事务传播行为的默认值。 |
PROPAGATION_SUPPORTS | 支持现有的事务。如果当前没有事务在进行,就以非事务的方式执行 |
PROPAGATION_MANDATORY | 方法必须在一个现有事务中进行,否则会抛出异常。 |
PROPAGATION_REQUIRES_NEW | 必须在它自己的新启事务里进行。如果现有事务在进行就先暂停它 |
PROPAGATION_NOT_SUPPORTED | 不应在事务中进行。如果现有事务在进行就先暂停它 |
PROPAGATION_NEVER | 不应在事务中进行。如果现有事务在进行就抛出异常 |
PROPAGATION_NESTED | 如果现有事务正在进行,则该方法运行在一个嵌套式事务中。否则PROPAGATION_REQUIRED执行 |
2>.隔离级别(5个)
隔离级别 | 说明 |
ISOLATION_DEFAULT | 使用底层数据库默认的隔离级别spring事务隔离级别的默认值 |
ISOLATION_READ_UNCOMMITED | 充许另一个事务可以读到这个事务未提交的数据可能导致脏读、不可重复读和幻读。 |
ISOLATION_READ_COMMITED | 保证一个事务修改的数据提交后才能被另一个事务读取可能导致不可重复读和幻读。 |
ISOLATION_REPEATABLE_READ | 要求对相同字段的多次读取的结果必须相同,除非事务本身更新了数据可能导致幻读。 |
ISOLATION_SERIALIZABLE | 事务被处理为顺序执行可以防止脏读、不可重复读、幻读。 |
3>.只读提示
如果事务只对后端数据进行读操作,则后端数据库可以采用一些优化措施来提高执行效率。但必须在事务中才有效。也就是说要搭配传播行为PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED 来设置。
4>.事务超时间隔
还可以设置事务的超时间隔,让事务在特定秒数后自动回滚,不必等它自己结束。由于计时是从事事务开始时算起的,所以它也得搭配传播行为为 PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED 来设置。
5>.回滚规则
当事务运行过程中抛出异常时,事务可以被声明为回滚或者不回滚。默认情况下只在出现RuntimeException才会回滚,而在出现受检异常时不回滚。
当然,也可以改变这种回滚规则,可以声明一个事务在出现特定的受检异常时能回滚。也可以声明一个事务在出现特定的非受检异常时不回滚。
Ioc的理解和事务管理器