传智播客--Spring中的事务管理,hibernate整合,struts整合(佟刚)

通过前两天的学习,对spring有了个全新的认识.虽然我以前学习过也在公司里用过,可是有些东西就知道怎么使用而不明白其中的工作过程也原理.通过老 师深入的分析和讲解,使我对spring的理解有加深了一步.还有一天,好好学习.在后面的项目中使用才能得心应手.

1.事务的四个关键属性 (ACID)
    原子性(atomicity)
    一致性(consistency)
    隔离性(isolation)
    持久性 (durability)

编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码.
声明式事务管理: 大多数情况下比编程式事务管理更好用. 它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理. 事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理.

事务管理是一种横切关注点

2.并发事务所导致的问题
脏读 : 对于两个事物 T1, T2, T1  读取了已经被 T2 更新但 还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.(读未提交)
不可重复读 :对于两个事物 T1, T2, T1  读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读 :对于两个事物 T1, T2, T1  从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.(读已提交)

3.基于注解的事务管理
在 XML 文件中需要配置的项目:
    1)配置 JDBC 的事务管理器
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    2)配置支持基于注解方式的事务管理
    <tx:annotation-driven transaction-manager="transactionManager" />
   
    在 Java 文件中要使用这个注解:
    @Transactional
    默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚. 而受检查异常不会.
    rollbackFor:  遇到时必须进行回滚
    noRollbackFor: 一组异常类,遇到时必须不回滚

4.基于 XML 的事务管理
    XML:
    配置 JDBC 的事务管理器
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    配置基于 xml 文件的事务
    <tx:advice transaction-manager="transactionManager" id="txAdvice">
    配置事务属性
        <tx:attributes>
            <tx:method name="purchase" propagation="REQUIRES_NEW"/>
            <tx:method name="*" />
        </tx:attributes>
    </tx:advice>

    配置事务的使用范围: 切入点, 把切入点和事务属性关联的 advisor
    <aop:config>
        <aop:pointcut expression="execution(* cn.itcast.spring.transaction.xml.*.*(..))" id="txPointcut"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
    </aop:config>

5.事务的传播行为:
    事务的多种传播行为,我们必须要掌握着两种 required, requied_new 传播行为.   
    required: 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行.
    requied_new :当前的方法必须启动新事 务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起.

6.Hibernate整合
就是让 spring 管理和创建 SessionFactory.   
Spring 2.0 同时支持 Hibernate 2.x 和 3.x. 但 Spring 2.5 只支持 Hibernate 3.1 或更高版本

    CustomerDaoImpl 类,传统的自己手动的开启事务和关闭事务操作.
        问题:
        1). 因为一个 Dao 方法创建一个新的 Session, 所以无法实现事务
        2). 在每个 Dao 方法中都重复写同样的事务代码
        解决:   
        1).使用 HibernateTemplate 对象, 且使用 spring 的声明式事务.   
        2).使用 HibernateTemplate 对象   
       
    CustomerDaoImpl2 类,解决上面的问题.使用 HibernateTemplate 提供的类.   
        问题:耦合了 Spring 的     HibernateTemplate 类
        解决:在 DAO 中使用 sessionFactory.getCurrentSession() 方法, 然后在 Service 层开启事务.   
       
    CustomerDaoImpl3 类, 解决 CustomerDaoImpl2 的问题.
        开发中要使用这种实现    
   
    hibernate 的配置文件,可以自己配置,也可以交给 spring 配置
        指定 hibernate 的配置文件:
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>   
        在 spring 中配置:
        最好不要使用这种配置方式,配置文件不清晰,不方便管理.
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
       
        <property name="mappingResources">
            <list>
                <value>cn/itcast/spring/hibernate/Customer.hbm.xml</value>
            </list>
        </property>
       
7.Struts整合
让 spring 管理 struts 的 action
   
    ①WEB.XML:
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/classes/applicationContext*.xml</param-value>
        </context-param>
   
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
       
    ②struts-config.xml:
        一种:缺点:占用了 struts 的唯一扩展点
            <action-mappings>
                <action path="/customer-add">
                    <forward name="success" path="/success.jsp" />
                </action>
            </action-mappings>
   
            <controller>
                <set-property property="processorClass"
                    value="org.springframework.web.struts.DelegatingRequestProcessor" />
            </controller>
        二种:
        <action path="/user-add"
            type="org.springframework.web.struts.DelegatingActionProxy">
            <forward name="success" path="/success.jsp"></forward>
        </action>
   
    ③将 Action 注入到 IOC 容器中.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值