@nextleaf
2018-06-08T03:58:05.000000Z
字数 4237
阅读 792
<bean id="sl" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="ds"><props><prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop><prop key="show_sql">true</prop><prop key="format_sql">true</prop><prop key="">true</prop></props></property><property name="mappingResources"><list><value>com/nl/entity/Cost.hbm.xml</value></list></property></bean>
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 配置数据源,并设置连接池 --><bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!-- 设置数据库连接参数 --><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/"/><property name="driverClass" value="com.mysql.jdbc.Driver"/><property name="user" value="root"/><property name="password" value="huang"/><!-- 设置连接池参数 --><property name="initialPoolSize" value="3"/><property name="maxPoolSize" value="10"/><property name="minPoolSize" value="1" /><property name="acquireIncrement" value="2"/><property name="maxIdleTime" value="60"></property></bean><!-- 开启组件扫描 --><!-- <context:component-scan base-package="com.nl" /> --><!-- 配置sessionFactory,代替Hibernate主配置文件 --><bean id="sl" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="ds"><props><prop key="dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="show_sql">true</prop><prop key="format_sql">true</prop><prop key="">true</prop></props></property><property name="mappingResources"><list><value>com/nl/entity/Cost.hbm.xml</value></list></property></bean><bean id="costDao" class="com.nl.dao.CostDaoImpl"><property name="sessionFactory" ref="sf"></property></bean></beans>
<!--这里id对应的bean是负责事务控制的方面组件,该组件Spring已经预置了--><!--HibernateTransactionManager针对的是Hibernate技术,而org.springframework.jdbc.datasource.DataSourceTransactionManager是针对jdbc技术的方面组件--><bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><!--如果使用的是jdbc需要注入dataSource,如果使用的是Hibernate技术需要注入SessionFactory--><property name="sessionFactory" ref="sessionFactory"/></bean><!--通过tx:advice声明了一个通知,制定了什么时候开启什么事务--><!--tx:advice指通知,propagation:指事务类型,一般DML(增删该)方法用propagation="REQUIRED",表示开启事务。查询方法用read-only="true",表示不支持事务,效率更高--><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="update*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="add*" propagation="REQUIRED"/><tx:method name="load*" read-only="true"/><tx:method name="execute" propagation="REQUIRED"/></tx:attributes></tx:advice><aop:config proxy-target-class="true"><!--上面的txAdvice中包含了方面组件txManager,所以可以作用在下面的pointcut的切入点中--><aop:advisor advice-ref="txAdvice" pointcut="within(com.qn.action.*)"/></aop:config>
a,applicationContext-annotation.xml开启组件扫描
<context:component-scan base-package="com.nl" />
b,配置xml声明方面组件(因为方面组件是Spring提供的现成类,如上面的DataSourceTransactionManager或HibernateTransactionManager,所以无法使用注解,只能使用applicationContext-annotation.xml文件配置)
<!--这里id对应的bean是负责事务控制的方面组件,该组件Spring已经预置了--><!--org.springframework.orm.hibernate3.HibernateTransactionManager针对的是Hibernate技术,而org.springframework.jdbc.datasource.DataSourceTransactionManager是针对jdbc技术的方面组件--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--如果使用的是jdbc需要注入dataSource,如果使用的是Hibernate技术需要注入SessionFactory--><property name="dataSource" ref="ds"/></bean>
c,开启事务注解配置
<!--proxy-target-class="true"指在使用动态代理时,使用cglib的方式--><tx:annotation-drivenproxy-target-class="true"transaction-manager="方面组件的id"/>
d,使用注解配置事务
先将要开启事务的组件声明到Spring容器
@Transactional等价于
@Transactional(propagation=Propagation.REQUIRED)
上面是简写方式
如果不希望方法开启事务
@Transactional(readOnly=true)
注:
@Transactional注解可以加到类上,表示类中所有的方法都按照这种方式控制事务,
@Transactional注解也可以加到方法上,表示当前方法按照这种方式控制事务(那么其他方法可能与当前方法控制事务的方式不一致)
推荐:
AOP最好用配置(因为配置可以对方面,切入点,通知类型,目标组件都一目了然)
bean的声明可以用注解
