SSM之Service层基于注解的声明式事物
2016-05-31 11:20
555 查看
原文地址:
前面我们已经做了SpringMVC和MyBatis整合的DAO设计,如果还没有整合,那么请参考:
http://blog.csdn.net/uq_jin/article/details/51527404。
现在我们来做Service层的设计
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/62ca0ebeb95993d57e4eec61bd2b11e7)
https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/36f7b022419e5cb6d75f476714524ea6)
这里有5个用户,我们测试保存用户并测试事物是否生效。如下:
我们需要在UserServiceImpl的save方法里抛出一个异常看是否插入进去数据
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/2d28e8250373189fb2e25c785120adb7)
查看测试结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/42147bfab05110fcb47e6bcf24cd0477)
先插入,然后查询,发现还是5条记录,说明事物成功。删掉异常再次测试如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/1d4f41c78cece47d6fbc39b55df2a7e6)
发现多了一个id为7的记录,那是因为6被回滚了,所以新数据的id为7
源码下载地址: https://github.com/cskun/SSM.git
前面我们已经做了SpringMVC和MyBatis整合的DAO设计,如果还没有整合,那么请参考:
http://blog.csdn.net/uq_jin/article/details/51527404。
现在我们来做Service层的设计
整合完成图
UserService.java
这里是一个Service接口:站在”使用者”的角度去设计public interface UserService { public List<User> findAll(); public void save(User user); }
UserServiceImpl.java
接口的具体实现,这里采用注解来实现依赖注入,以及基于注解的声明式事物@Service public class UserServiceImpl implements UserService { @Autowired //注入DAO private UserDao mUserDao; public List<User> findAll() { return mUserDao.findAll(); } @Transactional public void save(User user) { mUserDao.save(user); } }
spring-service.xml
配置事物管理器以及扫描注解来实现依赖注入<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"> <!-- 扫描所有的Service --> <context:component-scan base-package="me.jinkun.ssm.service"/> <!-- 事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 基于注解的声明时事物 : 1、开发团队达成一致约定,明确标注事物的方法 2、保证事物方法的执行时间尽可能短 3、不是所有的方法都需要事物,如只有一条修改记录操作 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
logback.xml
logback的日志配置,这里是默认配置,具体配置见:https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast
<!-- 参考:https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast --> <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern> </layout> </appender> <logger name="me.jinkun.ssm" level="TRACE"/> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
UserServiceTest.java
Junit 测试类@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:/spring/*.xml"}) public class UserServiceTest { Logger mLogger = LoggerFactory.getLogger(this.getClass()); @Resource private UserService mUserService; @Test public void save() { User user = new User(); user.setUsername("jack"); user.setUserpass("1234"); mUserService.save(user); } @Test public void findAll() { List<User> userList = mUserService.findAll(); for (User user : userList) { System.out.println(user); } mLogger.info(userList.toString()); } }
查看测试结果
查询:这里有5个用户,我们测试保存用户并测试事物是否生效。如下:
我们需要在UserServiceImpl的save方法里抛出一个异常看是否插入进去数据
查看测试结果:
先插入,然后查询,发现还是5条记录,说明事物成功。删掉异常再次测试如下:
发现多了一个id为7的记录,那是因为6被回滚了,所以新数据的id为7
源码下载地址: https://github.com/cskun/SSM.git
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- 深入浅析mybatis oracle BLOB类型字段保存与读取
- springmvc 发送ajax出现中文乱码的解决方法汇总
- MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- SpringMVC整合mybatis实例代码