1. 程式人生 > >獲取ApplicationContext的方法及手動控制事務提交

獲取ApplicationContext的方法及手動控制事務提交

        首先新建一個類SpringContextHolder.java,類的內容如下,其中setApplicationContext(ApplicationContext applicationContext)會在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);
    }

}
      寫的這個類要在spring配置檔案中進行配置,如下所示,這樣才能在spring啟動的時候去自動給ApplicationContext賦值,否則spring根本就不知道有這麼一個類,也不會去自動賦值。
<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);
		}