spring事务管理aop

Posted alexhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring事务管理aop相关的知识,希望对你有一定的参考价值。

达内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的主要内容,如果未能解决你的问题,请参考以下文章

Spring框架 AOP

[刘阳Java]_Spring入门_第1讲

spring-AOP原理与应用

Spring原理篇(14)--Spring AOP源码的实现<一>

Spring AOPSpring AOP之如何通过注解的方式实现各种通知类型的AOP操作进阶篇

源码学习之AOPSpring AOP使用