ContextLoaderListener監聽器的作用就是啓動Web容器時,自動裝配ApplicationContext的配置信息。因爲它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啓動容器時,就會默認執行它實現的方法。至於ApplicationContext.xml這個配置文件部署在哪,如何配置多個xml文件,書上都沒怎麼詳細說明。現在的方法就是查看它的API文檔。在ContextLoaderListener中關聯了ContextLoader這個類,所以整個加載配置過程由ContextLoader來完成。看看它的API說明
//通過ContextLoader獲取WebApplicationContext
WebApplicationContext contextLoader = ContextLoader.getCurrentWebApplicationContext();//設置屬性的默認屬性
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
//設置事務的傳播行爲,此處是設置爲開啓一個新事物
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
//設置事務的隔離級別,此處是讀已經提交
definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
for(int i=1;i<=pageCount;i++){
/*if(i == 2){
int j = 1/0;
}*/
//從spring容器對象中獲取DataSourceTransactionManager,這個根據配置文件中配置的id名(transactionManager)
DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) contextLoader.getBean("transactionManager");
//獲取事務狀態對象
TransactionStatus transactionStatus = (TransactionStatus) transactionManager.getTransaction(definition);
try{
int offset = (i-1)*pageSize;
orderVo.setOffset(offset);
List<OrderTemp> list = this.orderTempMapper.grabYiHaoDianTempOrderToOrder(orderVo);
for (OrderTemp orderTemp : list) {
//臨時表中的狀態是異步時才能導入到訂單表中
if(orderTempConstants.OR_STATUS_ASYN.equals(orderTemp.getOrStatus())){
if(judgeOrOrderNum(orderTemp.getOrNum(),orderTemp.getElactPlatId()) == null){
createOrder(orderTemp,platAssoMap,dcBranchIdMap,userId);
}/*else{
Order order = judgeOrOrderNum(orderTemp.getOrNum(),orderTemp.getElactPlatId());
updateOrder(orderTemp, platAssoMap, dcBranchIdMap, userId, order);
}*/
}
}
//狀態刷新
transactionStatus.flush();
//事物提交
}catch(Exception e){
//異常回滾
}
}