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的实际方向应该是:代理对象---->拦截器--->目标对象--->拦截器 (拦截器可以为多个,这里只有一个拦截器)