@nextleaf
2018-06-08T11:58:05.000000Z
字数 4237
阅读 664
<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"?>
<beans
xmlns="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/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://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-driven
proxy-target-class="true"
transaction-manager="方面组件的id"/>
d,使用注解配置事务
先将要开启事务的组件声明到Spring容器
@Transactional
等价于
@Transactional(propagation=Propagation.REQUIRED)
上面是简写方式
如果不希望方法开启事务
@Transactional(readOnly=true)
注:
@Transactional
注解可以加到类上,表示类中所有的方法都按照这种方式控制事务,
@Transactional
注解也可以加到方法上,表示当前方法按照这种方式控制事务(那么其他方法可能与当前方法控制事务的方式不一致)
推荐:
AOP最好用配置(因为配置可以对方面,切入点,通知类型,目标组件都一目了然)
bean的声明可以用注解