我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > spring Ioc的理解和事务管理器
总共48086条微博

动态微博

查看: 1090|回复: 0

spring Ioc的理解和事务管理器

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2015-02-16 10:09:40 |只看该作者 |倒序浏览
    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=”z_xiaofei168”/>
    <property name=”pass”value=”z_xiaofei168”/></bean>
    <!-- 装配Bean的继承子类中用parent属性指定父类标识或别名子类可以覆盖父类的属性装配,也可以新增自己的属性装配-->
    <bean id=”child” class=”cn.csdn.service.Chlid”parent=”parent”>
    <property name=”pass” value=”123123”/>
    <propertyname=”age” value=”22”/></bean>
    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才会回滚,而在出现受检异常时不回滚。
    当然,也可以改变这种回滚规则,可以声明一个事务在出现特定的受检异常时能回滚。也可以声明一个事务在出现特定的非受检异常时不回滚。

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表