您的位置:首页 > 编程语言 > Java开发

spring中事务的管理基于xml和注解,以及spring在web中应用

2016-04-20 19:15 956 查看
spring中的核心内容就是aop(面向切面编程),姑且不谈spring中其他框架,

但就谈spring本身,spring属于业务层的框架,最主要的核心内容就是实现各层解耦,和事务管理:但是aop如何如何实现事务管理呢,代这里列举的是经典的转账例子,代码如下:

这里不再贴接口字体实现类代码:

dao层实现类:

package com.leige.dao.impl;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.leige.dao.UserDao;

public class UserDaiImpl extends JdbcDaoSupport implements UserDao  {
//执行修改操作
@Override
public void update(String name, Double money) {

try {
String sql="update t_user set money=money+? where name=?;";
super.getJdbcTemplate().update(sql,money,name);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}

}

}
service层实现:
package com.leige.service.impl;

import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import com.leige.dao.UserDao;
import com.leige.service.UserService;

public class UserServiceImpl  implements UserService{
UserDao userDao;

public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Transactional(isolation=Isolation.DEFAULT)
@Override//如果使用xml配置,这事务注解不用写
public void transfer(String from, String to, Double money) {
// TODO Auto-generated method stub
userDao.update(from, -money);
/*	int i=5;
i=i/0;*/
userDao.update(to, money);
}

}


实体类:
package com.leige.domain;

public class User {
private Integer id;
private String name;
private Double money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}

}
注解和xml配置实现:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">
<context:annotation-config/>
<!--  					配置数据库连接池 -->
<bean id="dataSourse" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"/>
<property name="password" value=""/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="acquireIncrement" value="5"/>
<property name="maxPoolSize" value="50"/>
<property name="initialPoolSize" value="5"/>
</bean>
<!-- 配置业务层的注入 -->
<bean id="userService" class="com.leige.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<!-- 配置dao层的注入 -->
<bean id="userDao" class="com.leige.dao.impl.UserDaiImpl">
<!-- 配置数据库连接池的注入 -->
<property name="dataSource" ref="dataSourse"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourse"/>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
<!-- 配置事务详情,上一条是使用注解实现的事务管理,不管是使用注解还是xml事务管理器都是必须要配置的
<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>
设置要被管理的方法

<tx:method> 确定事务详情配置
name : 确定方法名称
transfer 确定名称
add* 	add开头
*	任意
propagation 传播行为
isolation 隔离级别
read-only="false" 是否只读
rollback-for="" 指定异常回滚(-)
no-rollback-for="" 指定异常提交(+)
经典应用:开发中规定
<tx:method name="add*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="find*" read-only="true"/>

<tx:method name="transfer" read-only="false" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.leige.service.impl.*.*(..))" id="myPointCut"/>

<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointCut"/>
</aop:config> -->
</beans>


spring在web中的应用在Servlet中获取spring容器:

首先在web.xml中加入spring的监听器以及所需要的参数:

<!-- 通过 servletContext 初始化参数设置xml位置,否则默认是WEB-INF/applicationContext.xml中读取配置文件
记住参数的名称,可在源码中查看 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<listener>
<!--   配置spring的监听器,这样可以是服务器已启动就加载spring的配置文件在这里即是beans.xml
-->
<description>spring 中加载配置文件的监听器</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>
servlet中获取spring的容器:

package com.leige.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.leige.service.UserService;

public class UserServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext servletContext=request.getServletContext();
//从Servlet中获取spring容器:
//使用WebApplicationContextUtils中的方法获取ApplicationContext,需要传入一个ServletContext
ApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(servletContext);
//得到容器之后就可以完成service层的操作
UserService userService=(UserService) context.getBean("userService");
userService.transfer("leige", "leige2", 100.0);//转账业务
request.getRequestDispatcher("/index.jsp").forward(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

}

}


注解实现需要注意的是,需要将事务交给spring管理:

将xml中配置事务管理的部分删除,添加一个:
<tx:annotation-driven transaction-manager="txManager"/>

另外需要在service层方法中配置需要事务管理的注解:
即:可以添加在类上也可以添加在方法上,别忘记配置注解扫描
@Transactional(isolation=Isolation.DEFAULT)
@Override
public void transfer(String from, String to, Double money) {
// TODO Auto-generated method stub
userDao.update(from, -money);
/* int i=5;
i=i/0;*/
userDao.update(to, money);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: