Spring提供的事务管理有两种方式,编程式的和声明式的. 编程式的繁琐,我一般不喜欢用.
最喜欢的一种是利用Spring封装的aspectJ, 利用Aop来管理事务很方便的.
applicationcontext.xml
1首先创建一个事务管理器
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"> </property>
</bean>
2声明一个通知, 并声明此通知受某一个事务管理器管理
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" />
<tx:method name="*" readonly="true" />
</tx:attributes>
</tx:advice>
上面的一段话说明了txAdvice受transactionManager事务管理器管理, 并且管理save打头的方法. 其余的都不使用事务管理.
3最后利用advisor配置advice的切入点.
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(pulic * *..*.service.*.*(..))">
</aop:advisor>
</aop:config>
这样, 只要经过service层就会进入事务管理.
(begin - save - commit)动态代理
我想问为什么 经过service层就会进入事务管理 别说动态代理 具体是怎么做的
讲的白话一点就是在运行时在你的程序前后增加了事务的代码。
这个很好理解,你可以试试如果你的
bean
对象没有放置在ioc
容器中管理时是不会有事务控制的。为什么spring提倡面向接口编程呢,其实就是在程序运行时,动态生成接口的子类,在
di
依赖注入时的对象是由spring动态生成的(代理对象),而不是你创建的那个bean
。在生成的代码中调用实际的bean
对象,在前面增加公共的代码。打个断点看看线程堆栈一目了然。
一周热门 更多>