使用Spring-Aop实现Hibernate事务管理
2008-10-07 20:32
387 查看
1.当你发现一些方法同时需求某项共同的功能时那么,你应该想到的是Aop。面向方面,把共同的功能以方面的形式切入方法中
术语:
advice,advisor,intercepter-我一般都把他们理解成拦截器
point-cut 即为我们需要切入方面的点。
2.在ssh开发当中,我们把业务放在struts的Action当中,我们同时希望事务控制也能在业务当中,所以我们可以对dao的实现方法切入我们的方面。
下面是我的配置文件,带你简单了解下spring配置Hibernate的事务:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/mldn"></property>
<property name="username" value="root"></property>
<property name="password" value="yudylaw"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>yudylaw/tran/vo/Tran.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="trandaoimplTarget" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="trandaoimpl"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="trandao" class="yudylaw.tran.DAO.TranDAO" abstract="true">
</bean>
<bean id="trandaoimpl" class="yudylaw.tran.DAOImpl.TranDAOImpl" parent="trandao">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate"/>
</property>
</bean>
<bean name="/tran" class="yudylaw.tran.struts.action.TranAction">
<property name="trandao">
<ref bean="trandaoimplTarget"/>
</property>
</bean>
</beans>
TranAction的核心代码:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
try {
Tran tran = new Tran(11004,"andy");
this.trandao.addTran(tran);
System.out.println("自动提交才对");
//自动提交
} catch (Exception e) {
System.out.println("应该回滚才对");
//自动回滚
e.printStackTrace();
}
return null;
}
这样Hibernate的事务就代理成功了,只要trandao的add*方法抛出异常,那么事务会自动回滚。
几点注意的地方:
target属性:就是目标对象,既是被代理对象,这里是trandaoimpl
hibernate的自动提交一定得关掉
<bean name="/tran" class="yudylaw.tran.struts.action.TranAction">
<property name="trandao">
<ref bean="trandaoimplTarget"/>
</property>
</bean>
这里trandao的参考bean应该是代理对象,这样事务拦截器就切入了trandaoimpl方法,实现了代理功能。
AOP的实际方向应该是:代理对象---->拦截器--->目标对象--->拦截器 (拦截器可以为多个,这里只有一个拦截器)
术语:
advice,advisor,intercepter-我一般都把他们理解成拦截器
point-cut 即为我们需要切入方面的点。
2.在ssh开发当中,我们把业务放在struts的Action当中,我们同时希望事务控制也能在业务当中,所以我们可以对dao的实现方法切入我们的方面。
下面是我的配置文件,带你简单了解下spring配置Hibernate的事务:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/mldn"></property>
<property name="username" value="root"></property>
<property name="password" value="yudylaw"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>yudylaw/tran/vo/Tran.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="trandaoimplTarget" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="trandaoimpl"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="trandao" class="yudylaw.tran.DAO.TranDAO" abstract="true">
</bean>
<bean id="trandaoimpl" class="yudylaw.tran.DAOImpl.TranDAOImpl" parent="trandao">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate"/>
</property>
</bean>
<bean name="/tran" class="yudylaw.tran.struts.action.TranAction">
<property name="trandao">
<ref bean="trandaoimplTarget"/>
</property>
</bean>
</beans>
TranAction的核心代码:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
try {
Tran tran = new Tran(11004,"andy");
this.trandao.addTran(tran);
System.out.println("自动提交才对");
//自动提交
} catch (Exception e) {
System.out.println("应该回滚才对");
//自动回滚
e.printStackTrace();
}
return null;
}
这样Hibernate的事务就代理成功了,只要trandao的add*方法抛出异常,那么事务会自动回滚。
几点注意的地方:
target属性:就是目标对象,既是被代理对象,这里是trandaoimpl
hibernate的自动提交一定得关掉
<bean name="/tran" class="yudylaw.tran.struts.action.TranAction">
<property name="trandao">
<ref bean="trandaoimplTarget"/>
</property>
</bean>
这里trandao的参考bean应该是代理对象,这样事务拦截器就切入了trandaoimpl方法,实现了代理功能。
AOP的实际方向应该是:代理对象---->拦截器--->目标对象--->拦截器 (拦截器可以为多个,这里只有一个拦截器)
相关文章推荐
- Spring实现AOP方式之二:使用注解配置 Spring AOP
- Spring使用AspectJ注解和XML配置实现AOP
- Spring学习笔记 —— AOP(面向切面编程) 之使用ProxyFactoryBean实现AOP
- 使用Spring配置文件实现AOP
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能
- 使用Spring AOP结合自定义Java注解实现动态数据源设置
- 使用Spring的注解方式实现AOP
- 使用Spring AOP前置通知实现提高方法调用的安全性能
- 使用spring配置文件实现AOP
- Spring中使用AspectJ实现AOP
- Spring AOP:使用NameMatchMethodPointcutAdvisor实现切面编程
- Spring_6_使用注解的方式实现AOP
- Spring AOP 使用注解的方式实现用户日志的两种方法
- 8.4.2: Spring的AOP---使用AspectJ实现AOP
- 使用Spring的AOP实现接口方法执行时间记录
- Spring(12):使用注解(@AfterThrowing/@After/@Around)实现AOP异常增强与实例
- 使用Spring的注解方式实现AOP
- spring 4.0 AOP (使用AspectJ的注解方式 的aop实现)简单实例
- 基于Spring AOP和Groovy日志模板配置的日志记录框架的二次实现与使用案例
- 笔记有关在spring使用aop在实现service层时出现的问题