1. 程式人生 > >spring事務管理aop

spring事務管理aop

jdbc tran err att get ted cor cep pack

達內12 note unit 09 01

1.spring事務管理

2.spring提供了對事務管理支持

spring采用aop機制完成事務控制

可以實現在不修改原有組件代碼情況下實現事務控制功能。

spring提供了兩種事務管理方式:

a。編程式事務管理(編寫java代碼)

  TransactionTemplate

b.聲明式事務管理(編寫配置,大家都用這種)

  xml版本配置

  註解版本配置

  --配置DataSourceTransactionManager

  --開啟事務註解配置<tx:annotation>

  --在目標組件方法前添加@Transactional

註解版本例子:

例如UserServiceImpl中的regist註冊方法需要事務:

第一步,我們現在applicationContext.xml中配置事務管理組件

<!-- 配置事務管理組件 -->

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

  <property name="dataSource" ref="dbcp"></property>

</bean>

<!-- 開啟事務註解標記@Transactional -->

<!-- 當調用帶@Transactional 標記的方法時,將txManager事務管理功能切入到方法-->

<tx:annotation-driven transaction-manager="txManager"/>

第二步,在所有service類上,加上@Transactional註解

package org.alexhe.note.service;

import javax.annotation.Resource;

import org.alexhe.note.dao.IUserDao;

import org.alexhe.note.entity.NoteResult;

import org.alexhe.note.entity.User;

import org.alexhe.note.util.NoteUtil;

import org.springframework.stereotype.Service;

@Service("userService")

@Transactional//這裏加入事務註解

public class UserServiceImpl implements IUserService{

@Resource

private IUserDao userDao;//註入

@Override

public NoteResult checkLogin(String name, String pwd) throws Exception {

// TODO Auto-generated method stub

NoteResult result=new NoteResult();

User user=userDao.findByName(name);

if(user==null){

result.setStatus(1);

result.setMsg("用戶名不存在");

return result;

}

String md5_pwd=NoteUtil.md5(pwd);

if(!user.getCn_user_password().equals(md5_pwd)){

result.setStatus(2);

result.setMsg("密碼不正確");

return result;

}

result.setStatus(0);

result.setMsg("用戶名和密碼正確");

result.setData(user.getCn_user_id());//返回userid

return result;

}

@Override

public NoteResult regist(String name, String password, String nickname) throws Exception {

NoteResult result=new NoteResult();

//檢測用戶名是否被占用

User has_user=userDao.findByName(name);

if(has_user!=null){

result.setStatus(1);

result.setMsg("用戶名已被占用");

return result;

}

//註冊

User user=new User();

user.setCn_user_name(name);

user.setCn_user_desc(nickname);

String md5_pwd=NoteUtil.md5(password);

user.setCn_user_password(md5_pwd);//設置加密的密碼

String userId=NoteUtil.createId();

user.setCn_user_id(userId);//設置userid

//調用userDao保存

userDao.save(user);

result.setStatus(0);

result.setMsg("註冊成功");

return result;

}

}

xml版本配置例子:(配置比註解版復雜)

第一步,我們現在applicationContext.xml中配置事務管理組件,記得xml裏加入aop的頭

<!-- 配置事務管理組件 -->

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

  <property name="dataSource" ref="dbcp"></property>

</bean>

<tx:advice id="txAdvice" transaction-manager="txManager">

  <tx:attributes><!-- 哪些方法用事務,就寫在裏面 -->

    <tx:method name="regist"/>

    <tx:method name="checkLogin"/>

    <tx:method name="add*"/> <!-- 以add開頭的所有方法 -->

   <!--  <tx:method name="*"/> <!-- 所有方法都加註釋 -->

  </tx:attributes>

</tx:advice>

<aop:config>

  <aop:pointcut id="target" expression="within(org.alexhe.note.service..*)"/> <!-- expression代表哪個組件,作用在哪些組件上,這裏代表service包及其下面的所有組件-->

  <aop:advisor advice-ref="txAdvice" pointcut-ref="target"/>

</aop:config>

spring事務管理aop