`

简化Spring(2)--Model层

阅读更多

简化Spring(2)--Model层

     作者:江南白衣

    因为Spring自带的sample离我们的实际项目很远,所以官方一点的model层模式展现就靠Appfuse了。
     但Appfuse的model层总共有一个DAO接口、一个DAOImpl类、一个Service接口、一个ServiceImpl类、一个DataObject.....大概只有受惯了虐待的人才会欣然接受吧。
    另外,Domain-Driven逢初一、十五也会被拿出来讨论一遍。

    其实无论什么模式,都不过是一种人为的划分、抽象和封装。只要在团队里理解一致,自我感觉优雅就行了。
     我的建议是,一开始DO和Manager一生一旦包演全场,DO作为纯数据载体,而Manager类放置商业方法,用 getHibernateTemplate()直接访问数据库,不强制基于接口编程。当某天系统复杂到你直觉上需要将DAO层和Service层分开时, 再分开就好了。

    1.DataObject类
    
好 听点也可以叫Domain Object。Domain Driven Development虽然诱人,但因为Java下的ORM框架都是基于Data Mapper模式的,没有Ruby On Rails中那种Active Recorder的模式。所以,还是压下了这个欲望,Data Object纯粹作一个数据载体,而把数据库访问与商业逻辑操作统一放到Manager类中。

    2.Manager类
     我的Manager类是Appfuse中DAO类与Service类的结合体,因为:

    2.1 不想使用纯DAO
     以往的DAO是为了透明不同数据库间的差异,而现在Hibernate已经做的很好。所以目前纯DAO的更大作用是为了将来可以切换到别的ORM方案比如 iBatis,但一个Pragmaic的程序员显然不会无聊到为了这个机会不大的理由,现在就去做一个纯DAO层,项目又不是Appfuse那样为了 demo各种ORM方案而存在。

    2.2 也不想使用Service层来为Dao解耦
    在JPetStore里有一个很薄的Service层,Fascade了一堆DAO类,把这些DAO类的所有方法都僵硬的重复了一遍。理论上一个 Manager类可以管理数个Dao类,可以避免Dao之间直接耦合。但既然有Manager的情况下,商业逻辑都是写在Manager类的,那样子 Manager似乎还是调用另一个Manager比较妥当,调用裸Dao可能存在忽略了某些逻辑。所以,耦合又从Dao层升到Service层了。
     所以,除非你做的是超薄的不带逻辑的Service层,否则没有解耦的意义。
    何况,对一个不是死搬书的Designer来说,组件边界之内的类之间的耦合并不是耦合。

    3.去除不必要的基于接口编程
    众所周知,Spring是提倡基于接口编程的。
    但有些Manager类,比如SaleOrderManager ,只有5%的机会再有另一个Impl实现。95%时间里这两兄弟站一起,就像C++里的.h和.cpp,徒增维护的繁琐(经常要同步两个文件的函数声 明),和代码浏览跳转时的不便(比如从Controler类跟踪到Service类时,只能跳转到接口类的相应函数,还要再按一次复杂的热键才跳转到实现 类)
    连Martin Flower都说,强制每个类都分离接口和实现是过犹不及。只在有多个独立实现,或者需要消除对实现类的依赖时,才需要分离接口。

    3.1 DAO被强制用接口的原因
    Spring IOC本身是不会强制基于接口的,但DAO类一般要使用Spring的声明式事务机制,而声明式的事务机制是使用Spring AOP来实现的。Spring AOP的实现机制包括动态代理和Cgilib2,其中Spring AOP默认使用的Java动态代理是必须基于接口,所以就要求基于接口了。
    
    3.2 解决方法
    那就让Spring AOP改用CGLib2,生成目标类的子类吧,我们只要指定使用声明式事务的FactoryBean使用CGLib的方式来实现AOP,就可以不基于接口编程了。
    指定的方式为设置proxyTargetClass为true。如下:
<bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
id
="baseService"    abstract="true">
  
<property name="transactionManager" ref="transactionManager"/>
  
<property name="proxyTargetClass" value="true"/>

</bean>

     又因为这些Service Bean都是单例,效率应该不受影响。

    4.总结
    对比Appfuse里面的5个类,我的Model层里只有VO作为纯数据载体,Manager类放商业方法。有人说这样太简单了,但一个应用,要划成几个 JSP,一个Controller,一个Manager,一个VO,对我来说已经足够复杂,再要往上架墙叠屋,恕不奉陪,起码在我的项目范围里不需 要。(但有很多项目是需要的,神佑世人)

    后记:迫于世人的压力,SpringSide暂时还是把DAO和Service层分开了,但依然坚持不搞那么多接口。
另外,尽量利用IDEA的代码生成热键,为Manager类生成delegate的Dao类方法。
分享到:
评论

相关推荐

    jasypt-spring-boot-starter 3.0.5依赖的pom及jar

    总的来说,jasypt-spring-boot-starter 3.0.5为Java开发者提供了一个高效且安全的方式来管理和使用加密数据,简化了Spring Boot应用中的安全实践。通过深入理解POM文件中的依赖关系和JAR文件中的实现细节,我们可以...

    spring-boot-starter-parent-1.5.13.RELEASE.zip

    2. `spring-boot-starter-parent-1.5.13.RELEASE.pom` - 这是实际的POM文件,包含了Starter Parent的元数据,如项目信息、依赖、插件配置等。当我们在Spring Boot项目中引用这个Starter Parent时,这些信息会被继承...

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    Web-Servlet模块是Spring MVC的基石,提供了模型-视图-控制器(Model-View-Controller)架构,使得开发Web应用程序更为简单。Web模块则提供了基础的Web上下文,适合非MVC的Web应用程序。 4. **AOP**:AOP模块提供了...

    struts2-spring-plugin-2.2.1.jar

    Struts2 是一个基于MVC(Model-View-Controller)设计模式的Java Web开发框架。它提供了强大的控制层,帮助开发者构建可维护、可扩展的Web应用。Struts2的核心功能包括:Action映射、结果映射、拦截器机制、强大的...

    struts2-spring-plugin-2.3.4.jar

    在Java Web开发中,这两个框架经常一起使用,Spring 提供了依赖注入(DI)和面向切面编程(AOP)等功能,而 Struts 2 则是一个强大的MVC(Model-View-Controller)框架,负责处理用户请求和业务逻辑。 Struts 2 和 ...

    spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE

    Spring Web MVC模块(spring-webmvc-5.2.3.RELEASE.jar)是Spring框架中用于构建MVC(Model-View-Controller)架构的Web应用程序的核心部分。它为Web开发提供了一种强大且灵活的模型绑定、数据验证、异常处理和视图...

    spring-framework-master

    5. **MVC(Model-View-Controller)模块**:Spring MVC是Spring框架的一部分,提供了一种用于构建Web应用的模型-视图-控制器架构。 6. **Test模块**:提供了对JUnit和TestNG的支持,方便进行单元测试和集成测试。 ...

    Spring-MVC-model

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(Model-View-Controller,MVC)架构的应用程序提供了一种有效的方式。在Spring 3.2.6版本中,该框架已经相当成熟和完善,为开发者提供了...

    spring-ai-core 0.8.1

    首先,Spring AI Core 0.8.1的核心目标是简化AI模型的部署和管理。它提供了一个统一的接口,允许开发者通过熟悉的Spring编程模式来处理AI模型,这包括加载模型、执行预测以及进行模型训练等操作。这一版本的发布,...

    spring-framework-5.3.20

    3. **Web**:Spring Web模块提供了将Spring应用整合到Web环境中的基础,包括MVC(Model-View-Controller)框架,用于构建高性能的Web应用。 4. **AOP(Aspect Oriented Programming)**:面向切面编程模块,允许...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    它与流行的MVC框架如Struts进行了更紧密的集成,提供了模型-视图-控制器(Model-View-Controller,MVC)的实现,简化了Web应用的开发。同时,2.5版本增强了Servlet API的支持,可以直接利用Servlet 2.5规范的新特性...

    spring-framework-5.0.2.RELEASE官方完整包加官方文档

    Spring Framework的核心特性包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect-Oriented Programming, AOP)、模型-视图-控制器(Model-View-Controller, MVC)架构模式,以及对Java EE标准和第三方...

    spring-tool-suite-3.9.6.RELEASE-e4.9.0-win32.zip

    此外,Spring还提供了MVC(Model-View-Controller)架构,用于构建Web应用,以及Spring Data用于数据库操作,Spring Security用于权限管理和认证。 压缩包子文件的文件名称列表中提到的"sts-bundle"通常包含了完整...

    官方原版完整包 spring-framework-5.3.3.RELEASE.zip

    Spring MVC是Spring框架的一部分,提供了一种用于构建Web应用的MVC(Model-View-Controller)模式实现,支持RESTful风格的URL设计和数据绑定。 **spring-5.3.3-docs.zip** 包含了Spring框架的官方文档,这对于学习...

    struts2-spring-plugin-2.2.3.1.jar

    **Struts2框架** 是一个开源的MVC(Model-View-Controller)框架,用于构建可维护性和可扩展性高的Java Web应用程序。它的核心设计目标是提供一种方式来组织和控制应用程序的行为,使得业务逻辑和表现层分离,从而...

    官方原版spring-framework-4.3.18.RELEASE.zip

    Spring Framework支持多种开发模式,比如模型-视图-控制器(Model-View-Controller,MVC)架构,用于构建Web应用。Spring Data提供了一组模块,简化了与各种数据存储的交互,包括JDBC、ORM框架如Hibernate和MyBatis...

    spring boot - mybatis

    Spring Boot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它预设了许多默认配置,使得开发者可以快速创建一个独立运行的、生产级别的基于Spring的应用。 2. **MyBatis简介** ...

    spring-5.3.9-dist.zip

    在Web层,Spring MVC(Model-View-Controller)是一个强大的MVC框架,用于构建高性能、灵活的Web应用程序。它提供了请求处理、视图解析、模型绑定等功能,与其他Spring组件紧密集成,如Spring Security用于安全控制...

    最新版完整包 spring-5.3.9.RELEASE-dist.zip

    6. **Web 模块**:Spring Web 模块包括 MVC(Model-View-Controller)框架,用于构建 web 应用。Spring MVC 提供了强大的视图解析、参数绑定、异常处理等功能,并与 RESTful 风格的开发无缝对接。 7. **Spring Boot...

Global site tag (gtag.js) - Google Analytics