Spring的事务管理难点剖析(2):应用分层的迷惑(一)

2014-11-24 08:46:59 · 作者: · 浏览: 1

Web、Service及DAO三层划分就像西方国家的立法、行政、司法三权分立一样被奉为金科玉律,甚至有的开发人员认为如果要使用Spring的事务 管理就一定要先进行三层的划分。这个看似荒唐的论调在开发人员中颇有市场。更有甚者,认为每层必须先定义一个接口,然后再定义一个实现类。其结果是:一个 很简单的功能,也至少需要3个接口和3个类,再加上视图层的JSP和JS等,打牌都可以围上两桌了,这种误解贻害不浅。
对将“面向接口编程”奉为圭臬,认为放之四海而皆准的论调,笔者深不以为然。是的,“面向接口编程”是Martin Fowler、Rod Johnson这些大师提倡的行事原则。如果拿这条原则去开发框架和产品,怎么强调都不为过。但是,对于我们一般的开发人员来说,做的最多的是普通工程项 目,往往只是一些对数据库增、删、查、改的功能。此时,“面向接口编程”除了带来更多的类文件外,看不到更多其他的好处。

Spring框架所提供的各种好处(如AOP、注解增强、注解MVC等)的唯一前提就是让POJO的类变成一个受Spring容器管理的Bean,除此以 外没有其他任何的要求。下面的实例用一个POJO完成所有的功能,既是Controller,又是Service,还是DAO:
01 package com.baobaotao.mixlayer;

02

03 import org.springframework.beans.factory.annotation.Autowired;

04 import org.springframework.jdbc.core.JdbcTemplate;

05 import org.springframework.stereotype.Controller;

06 import org.springframework.web.bind.annotation.RequestMapping;

07

08 //①将POJO类通过注解变成Spring MVC的Controller

09 @Controller

10 public class MixLayerUserService {

11

12 //②自动注入JdbcTemplate

13 @Autowired

14 private JdbcTemplate jdbcTemplate;

15

16 //③通过Spring MVC注解映射成为处理HTTP请求的函数,同时作为一个拥有事务性的方法

17 @RequestMapping("/logon.do")

18 @Transactional

19 public String logon(String userName,String password){

20 if(isRightUser(userName,password)){

21 String sql = "UPDATE t_user u SET u.score = u.score + WHERE user_name = ";

22 jdbcTemplate.update(sql,20,userName);

23 return "success";

24 }else{

25 return "fail";

26 }

27 }

28

29 private boolean isRightUser(String userName,String password){

30 //do sth

31 return true;

32 }

33 }

通过@Controller注解将MixLayerUserService变成Web层的Controller,同时也是Service层的服务类。此 外,由于直接使用JdbcTemplate访问数据,所以MixLayerUserService还是一个DAO。来看一下对应的Spring配置文件:

01 < xml version="1.0" encoding="UTF-8" >

02

03 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

04 xmlns:context="http://www.springframework.org/schema/context"

05 xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"

06 xmlns:tx="http://www.springframework.org/schema/tx"

07 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

08 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

09 …

10

18

20

21 p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

22

在①处,通过事务注解驱动使MixLayerUserService的logon()工作于事务环境下,②处配置了Spring MVC的一些基本设施。要使程序能够运行起来还必须进行web.xml的相关配置:

01 < xml version="1.0" encoding="UTF-8" >

02

03 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

04 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

05 http://j