獲取ApplicationContext的方法及手動控制事務提交
阿新 • • 發佈:2019-02-04
首先新建一個類SpringContextHolder.java,類的內容如下,其中setApplicationContext(ApplicationContext applicationContext)會在spring初始化的時候自動呼叫,這樣的好處就是我們不用每次使用ApplicationContext的時候都去重新初始化一次spring,只需要一次便可以了。
寫的這個類要在spring配置檔案中進行配置,如下所示,這樣才能在spring啟動的時候去自動給ApplicationContext賦值,否則spring根本就不知道有這麼一個類,也不會去自動賦值。package com.taotao.content.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextHolder.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } public static Object getBean(String beanName) { return applicationContext.getBean(beanName); } public static <T>T getBean(String beanName , Class<T>clazz) { return applicationContext.getBean(beanName , clazz); } }
<bean id="springContextHolder" class="com.taotao.content.utils.SpringContextHolder">
</bean>
在專案中需要用到ApplicationContext的地方,使用如下。
開啟事務後,我們進行業務邏輯處理,處理完之後對事務進行提交,如下所示。ApplicationContext ctx = SpringContextHolder.getApplicationContext(); //獲取事務 DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ctx.getBean("transactionManager"); DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔離級別,開啟新事務,這樣會比較安全些。 TransactionStatus status = transactionManager.getTransaction(def); // 獲得事務狀態
try {
//邏輯程式碼,可以寫上你的邏輯處理程式碼
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}