Spring事务管理配置过程 说明 该实例是针对web容器的实例, Spring的配置文件的初始化工作完成之后,将存在于web服务容器中。 Spring事务管理配置文件 数据源定义 <bean id="dataSource" class="org. apache commons. dbcp. Basic Source" destroy-method="close"> <property name="driver Name"><value>S(jdbc driver Name)</value></property> <property name="url"><value>S jdbc. url) </value></property> <property name="username"><value>Sdbe username </value></property> <property name="maxActive">value> jdbc. max Active)</value></property> <!- Spring的事务管理实现类 on Manager"class"org. springframework jdbc datasource. Data Source Transaction <property name="data Source"><ref local="data Source"/<property? 初始化配置文件 在web应用中的 web. xml中添加如下代码即可进行初始化工作 <param-name>contextconfigLocation</param-name>
Spring 事务管理配置过程 说明 该实例是针对 web 容器的实例,Spring 的配置文件的初始化工作完成之后,将存在于 web 服务容器中。 Spring 事务管理配置文件 <!-- dataSource 数据源定义 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"><value>${jdbc.driverClassName}</value></property> <property name="url"><value>${jdbc.url}</value></property> <property name="username"><value>${jdbc.username}</value></property> <property name="password"><value>${jdbc.password}</value></property> <property name="maxActive"><value>${jdbc.maxActive}</value></property> </bean> <!-- Spring 的事务管理实现类 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"><ref local="dataSource"/></property> </bean> 初始化配置文件 在 web 应用中的 web.xml 中添加如下代码即可进行初始化工作 <context-param> <param-name>contextConfigLocation</param-name> <param-value>
的配置文件放在web-inf/c1 asses/ spring目录下--> /WEB-INE/spring/*.xml </param-value> <l⊥ stener> <1⊥ stener-c1ass> org. springframework web context. ContextLoaderlistener </1⊥ stener> 上述代码的意义很简单,通过 Context loader Listener调用 context-param中所定义的 Spring配置文件,进行初始化工作 将 Spring的 ApplicationContext放到内存 将 Spring的上下文放到内存,方便程序调用 通过 Servlet将 Spring的上下文放到内存 public class SmeStarTer extends Http servlEt private static WebApplication Context context =null ∥上下文环境静态类 南执行初始化动作。 *aseejavax.servlethttpHttpservlet#<clinito public void init(javax. servlet Servlet Config config)throws javax. servlet Servlet Exception i 初始化动作 ontext= WebApplicationContextUtils get WebApplication Context(config. getServletContexto) Application Context set Context( context)
<!—Spring的配置文件放在Web-inf/classes/spring目录下--> /WEB-INF/spring/*.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> 上述代码的意义很简单,通过 ContextLoaderListener 调用 context-param 中所定义的 Spring 配置文件,进行初始化工作。 将 Spring 的 ApplicationContext 放到内存 将 Spring 的上下文放到内存,方便程序调用 通过 Servlet 将 Spring 的上下文放到内存 public class SMEStarter extends HttpServlet { private static WebApplicationContext context = null; // 上下文环境静态类 /** * 执行初始化动作。 * @see javax.servlet.http.HttpServlet# <clinit>() */ public void init(javax.servlet.ServletConfig config) throws javax.servlet.ServletException { super.init(config); //初始化动作 ontext = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext()); ApplicationContext.setContext(context); } /* * (非 Javadoc) * @see javax.servlet.Servlet#destroy()
public void destroyO i 取得上下文环境静态类 reture上下文环境静态类 public static WebApplication Context get Application ContextOi return context. ApplicationContext. java代码 public class Application Context f private static Log log=Log Factory get Log( Log Constants. COMMON LOG); ∥ Spring Framework的应用上下文对象 orivate static org. springframework context Application Context context=null 取得 Spring Framework的应用上下文对象。 areturn WebApplication Context Spring Framework的应用上下文对象 public static org. springframework, context Application Context get ApplicationContextOi return context. *设置 Spring Framework的应用上下文对象 * param context Spring Framework的应用上下文对象
*/ public void destroy() { super.destroy(); } /** * 取得上下文环境静态类。 * @return 上下文环境静态类 */ public static WebApplicationContext getApplicationContext() { return context; } } ApplicationContext.java 代码 public class ApplicationContext { private static Log log = LogFactory.getLog(LogConstants.COMMON_LOG); // Spring Framework 的应用上下文对象 private static org.springframework.context.ApplicationContext context = null; /** * 取得 Spring Framework 的应用上下文对象。 * @return WebApplicationContext Spring Framework 的应用上下文对象 */ public static org.springframework.context.ApplicationContext getApplicationContext() { return context; } /** * 设置 Spring Framework 的应用上下文对象。 * @param context Spring Framework 的应用上下文对象
public static void set Context(org. springframework context Application Context context) Application Context context=context *取得在上下文配置文件中定义的类的实例。p> 当<code>name</code>为nuI或者长度为0的字符串时,抛出<code> IllegalArgumentException</code>异常 param name在上下文配置文件中定义的类的名称 <code>name<code>为nul或者<code>name</code>对应的对象不存在时, 抛出< code>java. lang. IllegalAccessException<code>异常,并记录 error日志 areturn Object类的实例 if(name=null name length(==0)i throw new Illegal Argument Exception("必须指定要创建的对象的name"), Object ret=null context. get Bean( name) 1 catch(NoSuch Bean Definition Exception nsbde)i log errort("找不到指定的对象[name="+name+"]", nsbde) i catch( Beans Exception be)t log error("无法创建指定的对象[name="+name+"]",be), } return ret: 在 Struts中的 action中调用 Spring的事务管理 public Action Forward execute( final Action Mapping mapping, final Action Form form, final hTtp Servletrequest request final Http servlet Response response)throws Exception i
*/ public static void setContext(org.springframework.context.ApplicationContext context) { ApplicationContext.context = context; } /** * 取得在上下文配置文件中定义的类的实例。<p> * 当<code>name</code>为 null 或者长度为 0 的字符串时,抛出<code>IllegalArgumentException</code>异常。 * @param name 在上下文配置文件中定义的类的名称。 * <code>name</code> 为 null 或者 <code>name</code> 对应的对象不存在时, * 抛出 <code>java.lang.IllegalAccessException</code> 异常,并记录 error 日志 * @return Object 类的实例 */ public static Object getBean(String name) { if (name == null || name.length() == 0) { throw new IllegalArgumentException("必须指定要创建的对象的 name"); } Object ret = null; try { ret = context.getBean(name); } catch (NoSuchBeanDefinitionException nsbde) { log.error("找不到指定的对象 [name=" + name + "]", nsbde); } catch (BeansException be) { log.error("无法创建指定的对象 [name=" + name + "]", be); } return ret; } } 在 Struts 中的 action 中调用 Spring 的事务管理 public ActionForward execute(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
∥ DataSoureeTransaction Manager是 Spring Framework提供的针对 Data Source的事务管理类 ∥见 Spring的配置文件 final Data SourceTransaction Manager transaction Manager =( DataSource TransactionManager)Application Context. get Bean("transactionManager"); final String Wrapper forward =new String Wrapper final Exception Wrapper exception=new Exception Wrapper ∥ Transaction Template是 Spring Framework对事务操作的封装类,调用其 executed方法即可完成事务的操作 ∥ scute方法的参数有 Transaction Callback和 Transaction Callback Resul两种,本实例中采用后者。 ∥调用时需要实现 Transaction callback Without Result类的 don Transaction Without Result( ransaction Status) ∥方法,在该方法中调用事务操作的实际代码。当需要 rollback时,调用 Transaction Status set RollbackonIy0方法即可 TransactionTemplate tx Template= new Transaction Template( transaction Manager); txTemplate. execute(new Transaction Callback Without Resulto) ∥实现抽象方法,该方法中完成事务的具体操作 public void don Transaction WithoutResult(org. springframework transaction Transaction Status tStatus)i 注意,必须還过 transactionManager同一实例获取 DataSource,这样才能保证是同一事务 saction Manager. get DataSource 所有的操作都在该方法内执行 DataSource必须传到后面的子方法中,这样才能保证是同一事务 updateOperator I(bean, c I catch(Exception e)i /出现错误事务回滚 ); ∥进行事务操作( commit、 rollback等的过程中发生异常 log error("执行 Action时发生事务操作错误",txe)
// DataSourceTransactionManager 是 Spring Framework 提供的针对 DataSource 的事务管理类 //见 Spring 的配置文件 final DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ApplicationContext.getBean("transactionManager"); final StringWrapper forward = new StringWrapper(); final ExceptionWrapper exception = new ExceptionWrapper(); // TransactionTemplate 是 Spring Framework 对事务操作的封装类,调用其 execute()方法即可完成事务的操作。 // execute()方法的参数有 TransactionCallback 和 TransactionCallbackWithoutResult 两种,本实例中采用后者。 // 调用时需要实现 TransactionCallbackWithoutResult 类的 doInTransactionWithoutResult(TransactionStatus) // 方法,在该方法中调用事务操作的实际代码。当需要 rollback 时,调用 TransactionStatus.setRollbackOnly()方法即可。 TransactionTemplate txTemplate = new TransactionTemplate(transactionManager); try { txTemplate.execute(new TransactionCallbackWithoutResult() { // 实现抽象方法,该方法中完成事务的具体操作 public void doInTransactionWithoutResult(org.springframework.transaction.TransactionStatus tStatus) { //注意,必须通过 transactionManager 同一实例获取 DataSource,这样才能保证是同一事务 DataSource ds = transactionManager.getDataSource(); //所有的操作都在该方法内执行 Try{ //DataSource 必须传到后面的子方法中,这样才能保证是同一事务 updateOperator1(bean,ds) operator2(bean,ds) }catch(Exception e) { //出现错误事务回滚 tStatus.setRollbackOnly(); } } } ); } catch (TransactionException txe) { // 进行事务操作(commit、rollback 等)的过程中发生异常 log.error("执行 Action 时发生事务操作错误", txe);