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

SSM之Service层基于注解的声明式事物

2016-05-31 11:20 555 查看
原文地址:

前面我们已经做了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息