大部分项目都少不了spring的身影,为什么大家对他如此青睐,而且对他的追捧丝毫没有减退之势呢?

Spring是什么:

Spring是一个轻量级的DI和AOP容器框架。

jsp页面只能与表示层打交道Java 五年夜框架之间的比较 jQuery

说它轻量级有一大部分缘故原由是相对与EJB的(虽然本人从没有打仗过EJB的运用),主要的是,Spring是非侵入式的,基于spring开拓的运用一样平常不依赖于spring的类。

DI:称作依赖注入(Dependency Injection),和掌握反转一个观点,详细的讲,当一个角色须要其余一个角色帮忙的时候,在传统的程序设计中,常日有调用者来创建被调用者的实例。
但是在spring中创建被调用者将不再有调用者完成,因此叫掌握反转。
创建被调用工具有Spring来完成,在容器实例化工具的时候主动的将被调用者(或者说它的依赖工具)注入给调用工具,因此又叫依赖注入。

AOP:Spring对面向切面编程供应了强有力的支持,通过它让我们将业务逻辑从运用做事(如事务管理)等分离出来,实现了高内聚开拓,运用工具只关注业务逻辑,不再卖力其它系统问题(如日志、事务等)。
Spring支持用户自定义切面。

面向切面编程是面向工具编程的有力补充。
面向工具编程将程序分成各个层次的工具,面向切面的程序将运行过程分解成各个切面。
AOP是从运行程序的角度去考虑程序的构造,提取业务处理过程的切面,OOP是静态的抽象,AOP是动态的抽象,是对运用实行过程的步骤进行抽象,从而得到步骤之间的逻辑划分。

容器:Spring是个容器,由于它包含并且管理运用工具的生命周期和配置。
如工具的创建、销毁、回调等。

框架:Spring作为一个框架,供应了一些根本功能,(如事务管理,持久层集成等),使开拓职员更专注于开拓运用逻辑。

看完了Spring是什么,再来看看Spring有哪些优点

1.利用Spring的IOC容器,将工具之间的依赖关系交给Spring,降落组件之间的耦合性,让我们更专注于运用逻辑

2.可以供应浩瀚做事,事务管理,WS等。

3.AOP的很好支持,方便面向切面编程。

4.对主流的框架供应了很好的集成支持,如hibernate,Struts2,JPA等

5.Spring DI机制降落了业务工具更换的繁芜性。

6.Spring属于低侵入,代码污染极低。

7.Spring的高度可开放性,并不逼迫依赖于Spring,开拓者可以自由选择Spring部分或全部

Struts2的优点

Struts2 是一个相称强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。
它基于当年的Webwork和XWork框架,继续其优点,同时做了相称的改进。
Struts2现在在Java Web开拓界的地位可以说是大红大紫,从开拓职员的角度来剖析,Struts2之以是能够如此的深入开拓职员之心,与其优秀的设计是分不开的。

1、Struts2基于MVC架构,框架构造清晰,开拓流程一览无余,开拓职员可以很好的掌控开拓的过程。

我在项目开拓过程中,一个详细的功能的开拓流程是:拿到一个详细的功能需求文档和设计好的前台界面(在开拓中我不卖力设计页面),剖析须要从前台通报哪些参数,确定参数的变量名称,在Action中设置相应的变量,这些参数在前台如何显示,并将页面上的一些控件适当利用Struts2供应的做事器端控件来代替,编写Action对应的方法来完成业务逻辑,末了,做一些与配置文件干系的设置。
当然实际的开拓比这个过程要繁芜,涉及到数据库,验证,非常等处理。
但是利用Struts2进行开拓,你的关注点绝大部分是在如何实现业务逻辑上,开拓过程十分清晰明了。

2、利用OGNL进行参数通报。

OGNL供应了在Struts2里访问各种浸染域中的数据的大略办法,你可以方便的获取Request,Attribute,Application,Session,Parameters中的数据。
大大简化了开拓职员在获取这些数据时的代码量。

3、强大的拦截器

Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如非常处理,文件上传,验证等。
拦截器是可配置与重用的,可以将一些通用的功能如:登录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。
在我实现的的一Web项目中,便是利用Struts2的拦截器来完成了系统中的权限验证功能。

4、易于测试

Struts2的Action都是大略的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了Java Web项目的测试。

5、易于扩展的插件机制

在Struts2添加扩展是一件愉快而轻松的事情,只须要将所须要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中作一些大略的设置就可以实现扩展。
常用的Struts2的扩展可以通过这个链接找到:

http://cwiki.apache.org/S2PLUGINS/home.html

6、模块化

Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将运用程序模块化:

将配置信息拆分成多个文件

把自包含的运用模块创建为插件

创建新的框架特性,即将与特定运用无关的新功能组织成插件,以添加到多个运用中去。

7、全局结果与声明式非常

为运用程序添加全局的Result,和在配置文件中对非常进行处理,这样当处理过程中涌现指定非常时,可以跳转到特定页面,这一功能十分实用。

Spring MVC和Struts2的比较的优点

我们用struts2时采取的传统的配置文件的办法,并没有利用传说中的0配置。
spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外)。

Spring MVC和Struts2的差异:

机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。
以前认为filter是 servlet的一种分外),这样就导致了二者的机制不同,这里就牵扯到servlet和filter的差异了。

性能:spring会轻微比struts快。
spring mvc是基于方法的设计,而sturts是基于类,每次发一次要求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet掌握数据一样。
spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的表明,把request数据注入进去,在spring3 mvc中,一个方法对应一个request高下文。
而struts2框架是类级别的拦截,每次来了要求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action工具对应一个request高下文。

参数通报:struts是在接管参数的时候,可以用属性来接管参数,这就解释参数是让多个方法共享的。

设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。

intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP办法。
这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继续,以是我以为论利用上来讲,spring mvc利用更加简洁,开拓效率Spring MVC确实比struts2高。
spring mvc是方法级别的拦截,一个方法对应一个request高下文,而方法同时又跟一个url对应,以是说从架构本身上spring3 mvc就随意马虎实现restful url。
struts2是类级别的拦截,一个类对应一个request高下文;实现restful url要费劲,由于struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用表明或其他办法标识其所属方法了。
spring3 mvc的方法之间基本上独立的,独享request response数据,要求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

其余,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的要求更是方便,只需一个表明@ResponseBody ,然后直接返回相应文本即可。
送上一段代码:

[java] view plain copy

在CODE上查看代码片派生到我的代码片

@RequestMapping(value=“/whitelists”) public String index(ModelMap map) { Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId()); List groupList = groupManager.findAllGroup(account.getId()); map.put(“account”, account); map.put(“groupList”, groupList); return “/group/group-index”; } // @ResponseBody ajax相应,处理Ajax要求也很方便 @RequestMapping(value=“/whitelist/{whiteListId}/del”) @ResponseBody public String delete(@PathVariable Integer whiteListId) { whiteListManager.deleteWhiteList(whiteListId); return “success”; }

struts1与struts2实质差异

1 在Action实现类方面的比拟:Struts 1哀求Action类连续一个抽象基类;Struts 1的一个详细问题是利用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的做事成为可能。
Struts 2供应一个ActionSupport基类去实现常用的接口。
纵然Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用 作Struts 2的Action。

2 线程模式方面的比拟:Struts 1 Action是单例模式并且必须是线程安全的,由于仅有Action的一个实例来处理所有的要求。
单例策略限定了Struts 1 Action能做的事,并且要在开拓时非凡小心。
Action资源必须是线程安全的或同步的;Struts 2 Action工具为每一个要求产生一个实例,因此没有线程安全问题。

3 Servlet依赖方面的比拟:Struts 1 Action依赖于Servlet API,由于Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
Struts 2 Action不再依赖于Serzvlet API,从而答应Action分开Web容器运行,从而降落了测试Action的难度。
当然,如果Action须要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍旧可以访问它们。
但是,大部分时候,Action都无需直接访问HttpServetRequest和 HttpServletResponse,从而给开拓者更多灵巧的选择。

4 可测性方面的比拟:测试Struts 1 Action的一个紧张问题是execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器。
为了分开Web容器测试Struts 1的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock工具(仿照了HttpServetRequest和HttpServletResponse工具),从而 可以分开Web容器测试Struts 1的Action类。
Struts 2 Action可以通过初始化、设置属性、调用方法来测试。

5 封装要求参数的比拟:Struts 1利用ActionForm工具封装用户的要求参数,所有的ActionForm必须连续一个基类:ActionForm。
普通的JavaBean不能用 作ActionForm,因此,开拓者必须创建大量的ActionForm类封装用户要求参数。
虽然Struts 1供应了动态ActionForm来简化ActionForm的开拓,但依然须要在配置文件中定义ActionForm;Struts 2直策应用Action属性来封装用户要求属性,避免了开拓者须要大量开拓ActionForm类的啰嗦,实际上,这些属性还可以是包含子属性的Rich 工具类型。
如果开拓者依然怀念Struts 1 ActionForm的模式,Struts 2供应了ModelDriven模式,可以让开发者利用单独的Model工具来封装用户要求参数,但该Model工具无需连续任何Struts 2基类,是一个POJO,从而降落了代码污染。

6 表达式措辞方面的比拟:Struts 1整合了JSTL,因此可以利用JSTL表达式措辞。
这种表达式措辞有基本工具图遍历,但在对凑集和索引属性的支持上则功能不强;Struts 2可以利用JSTL,但它整合了一种更强大和灵巧的表达式措辞:OGNL(Object Graph Notation Language),因此,Struts 2下的表达式措辞功能更加强大。

7 绑定值到视图的比拟:Struts 1利用标准JSP机制把工具绑定到视图页面;Struts 2利用“ValueStack”技能,使标签库能够访问值,而不须要把工具和视图页面绑定在一起。

8 类型转换的比拟:Struts 1 ActionForm 属性常日都是String类型。
Struts 1利用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2利用OGNL进行类型转换,支持基本数据类型和常用工具之间的转换。

9 数据校验的比拟:Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。
Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。

10 Action实行掌握的比拟:Struts 1支持每一个模块对应一个要求处理(即生命周期的观点),但是模块中的所有Action必须共享相同的生命周期。
Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。
开拓者可以根据须要创建相应堆栈,从而和不同的Action一起利用。

Hibernate优点

(1) 工具/关系数据库映射(ORM)

它利用时只须要操纵工具,使开拓更工具化,抛弃了数据库中央的思想,完备的面向工具思想

(2) 透明持久化(persistent)

带有持久化状态的、具有业务功能的单线程工具,此工具生存期很短。
这些工具可能是普通的JavaBeans/POJO,这个工具没有实现第三方框架 或者接口,唯一分外的是他们正与(仅仅一个)Session干系联。
一旦这个Session被关闭,这些工具就会分开持久化状态,这样就可被运用程序的任 何层自由利用。
(例如,用作跟表示层打交道的数据传输工具。
)

(3) 事务Transaction(org.hibernate.Transaction)

运用程序用来指定原子操作单元范围的工具,它是单线程的,生命周期很短。
它通过抽象将运用从底层详细的JDBC、JTA以及CORBA事务隔离 开。
某些情形下,一个Session之内可能包含多个Transaction工具。
只管是否利用该工具是可选的,但无论是利用底层的API还是利用 Transaction工具,事务边界的开启与关闭是必不可少的。

(4) 它没有侵入性,即所谓的轻量级框架

(5) 移植性会很好

(6) 缓存机制,供应一级缓存和二级缓存

(7) 简洁的HQL编程

Hibernate缺陷

(1) Hibernate在批量数据处理时有弱势

(2) 针对单一工具大略的增删查改,适宜于Hibernate,而对付批量的修正,删除,不适宜用Hibernate,这也是OR框架的弱点;要利用数据库的特定优化机制的时候,不适宜用Hibernate

Hibernate和iBATIS 优缺陷比较

(把稳:iBATIS 是MyBATIS的前生,也便是1.0版本)

Hibernate的特点:

Hibernate功能强大,数据库无关性好,O/R映射能力强, Hibernate对数据库构造供应了较为完全的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动天生和实行。
程序员每每只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 供应的方法完成持久层操作。
程序员乃至不须要对SQL 的闇练节制, Hibernate/OJB 会根据制订的存储逻辑,自动天生对应的SQL 并调用JDBC 接口加以实行。
Hibernate的缺陷便是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和工具模型之间如何权衡取得平衡,以及若何用 好Hibernate方面须要你的履历和能力都很强才行,但是Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开拓速率都要强于iBATIS。

iBATIS的特点:

iBATIS入门大略, 即学即用,供应了数据库查询的自动工具绑定功能,而且延续了很好的SQL利用履历,对付没有那么高的工具模型哀求的项目来说,相称完美。
iBATIS的缺 点便是框架还是比较简陋,功能尚有缺失落,虽然简化了数据绑定代码,但是全体底层数据库查询实际还是要自己写的,事情量也比较大,而且不太随意马虎适应快速数据 库修正。
当系统属于二次开拓,无法对数据库构造做到掌握和修正,那iBATIS的灵巧性将比Hibernate更适宜。
系统数据处理量巨大,性能哀求极为 苛刻,这每每意味着我们必须通过经由高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
在这种情形下iBATIS会有更好的可控性和表现。

对付实际的开拓进行的比较:

1. iBATIS须要手写sql语句,也可以天生一部分,Hibernate则基本上可以自动天生,偶尔会写一些Hql。
同样的需求,iBATIS的事情量比 Hibernate要大很多。
类似的,如果涉及到数据库字段的修正,Hibernate修正的地方很少,而iBATIS要把那些sql mapping的地方逐一修正。

2. iBatis 可以进行细粒度的优化

比 如说我有一个表,这个表有几个或者几十个字段,我须要更新个中的一个字段,iBatis 很大略,实行一个sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是用 Hibernate 的话就比较麻烦了,缺省的情形下 hibernate 会更新所有字段。
当然我记得 hibernate 有一个选项可以掌握只保存修正过的字段,但是我不太确定这个功能的负面效果。

例 如:我须要列出一个表的部分内容,用 iBatis 的时候,这里面的好处是可以少从数据库读很多数据,节省流量SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE …一样平常情形下Hibernate 会把所有的字段都选出来。
比 如说有一个上面表有8个字段,个中有一两个比较大的字段,varchar(255)/text。
上面的场景中我为什么要把他们也选出来呢?用 hibernate 的话,你又不能把这两个不须要的字段设置为lazy load,由于还有很多地方须要一次把全体 domain object 加载出来。
这个时候就能显现出ibatis 的好处了。
如果我须要更新一条记录(一个工具),如果利用 hibernate,须要现把工具 select 出来,然后再做 update。
这对数据库来说便是两条sql。
而iBatis只须要一条update的sql就可以了。
减少一次与数据库的交互,对付性能的提升是非常重 要。

3. 开拓方面:

开拓效率上,我以为两者该当差不多。
可掩护性方面,我 以为 iBatis 更好一些。
由于 iBatis 的 sql 都保存到单独的文件中。
而 Hibernate 在有些情形下可能会在 java 代码中保sql/hql。
相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。
(iBatis 是将sql写在配置文件中的,而hibernate是自己天生的) 而iBATIS 的着力点,则在于POJO 与SQL之间的映射关系。
也便是说,iBATIS并不会为程序员在运行期自动天生SQL 实行。
详细的SQL 须要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。
利用iBATIS 供应的ORM机制,对业务逻辑实现职员而言,面对的是纯粹的Java工具,这一层与通过Hibernate 实现ORM 而言基本同等,而对付详细的数据操作,Hibernate会自动天生SQL 语句,而iBATIS 则哀求开拓者编写详细的SQL 语句。
相对Hibernate而言,iBATIS 以SQL开拓的事情量和数据库移植性上的让步,为系统设计供应了更大的自由空间。

4. 运行效率

在不考虑 cache 的情形下,iBatis 该当会比hibernate 快一些或者很多。

Spring 框架的优缺陷

Spring的上风不言而喻:

1. 供应了一种管理工具的方法,可以把中间层工具有效地组织起来。
一个完美的框架“黏合剂”。

2. 采取了分层构造,可以增量引入到项目中。

3. 有利于面向接口编程习气的养成。

4. 目的之一是为了写出易于测试的代码。

5. 非侵入性,运用程序对Spring API的依赖可以减至最小限度。

6. 同等的数据访问介面。

6. 一个轻量级的架构办理方案

缺陷也显而易见

1. 中断了运用程序的逻辑,使代码变得不完全,不直不雅观。
此时单从Source无法完备把握运用的所有行为。

2. 将原来该当代码化的逻辑配置化,增加了出错的机会以及额外的包袱。

3. 光阴倒退,失落去了IDE的支持。
在目前IDE功能日益强大的时期,以往代码重构等让人头痛的举动越来越随意马虎。
而且IDE还供应了诸多强大的赞助功能,使得 编程的门槛降落很多。
常日来说,掩护代码要比掩护配置文件,或者配置文件+代码的稠浊体要随意马虎的多。

4. 调试阶段不直不雅观,后期的bug对应阶段,不随意马虎判断问题所在。

经典架构S(Struts)SH的优缺陷

Struts、Spring、Hibernate能盛行这么多年耐久不衰,自然有它的道理。
J2EE最先涌现的时候,我们一样平常是采取 JSP+Servlet+JavaBean+EJB的架构,尤其是1998年~2000年这段韶光,互联网的泡沫从兴起到分裂,其波澜壮阔程度,丝毫不亚 于2008年开始的这次经济危急,在那个年代,是否节制EJB开拓技能将直接决定你的薪水能否翻一倍或者几倍。
不过,Spring的作者Rod Johnson在2002年根据多年履历撰写了《Expert o-ne-on-One J2EE Design and Development》,其后又揭橥了著名的《Expert o-ne-on-one J2EE Development without EJB》一书,则彻底地改变了传统的J2EE一统天下的开拓架构,基于Struts+Hibernate+Spring的J2EE架构也逐渐得到人们的认 可,乃至在大型的项目架构中也逐渐开始运用。
下面我们分别说说Spring、Struts和Hibernate的优缺陷。

Spring 是一个开源框架,是为理解决企业运用程序开拓繁芜性而创建的。
框架的紧张上风之一便是其分层架构,使得每个层之间和类与类之间的关系,由原来的强绑定与强 耦合转变为不绑定和松耦合,直接面向接口编程,把设计与实现相分离的原则发挥到极致,对付单元测试也产生了很深远的影响。
在Spring涌现之前,如果某 个模块没有完成,做单独模块的单元测试还是很困难的。
Spring同时也是 J2EE 运用程序开拓的集成框架,由于J2EE是讲究分层理念的,Spring使得J2EE每个层之间的模块职能更加清晰。

不过,对付大型项目的开拓,Spring使得原来难以掩护的类与类之间的强耦合关系,转变为更加难以掩护的XML文件配置,这个事情量也是非常巨大 的,而且更随意马虎出错。
而且,随着每个运用 模块的升级,这些模块之间的版本,也不会是同步更新的,对付同一个公共组件,有的模块用的可能是1.0版本,而另 外一个功能模块用的可能是2.0版本,恐怖的是1.0版本和2.0版本之间,可能还不兼容,Spring对付这些需求,就无能为力了。
以是,有人说 Spring不适宜大型项目开拓,也是有一定道理的。
最近Spring也加入了OSGI标准的实现,也是为理解决不同版本之间同时存在的这些问题。
不过, 随着Spring加入的功能越来越多,Spring也就失落去了轻量开源框架的特点,变得越来越笨重。

虽然Spring现在也支持了所谓的免配置,可以通过@Autowired标签自行绑定,还可以通过 设置自动绑定加载所有的Hibernate工具,但是如果这些上百个或者数十个中的任何一个Entity工具加载失落败,则全体Spring做事就启动不起 来了,这与难于支配的EJB有啥差异呢?而且,令人可笑的是,由于利用了@Autowired标签,相称一部分开拓职员不再面向接口编程了,对付 Class A的实例,美其名曰由Spring自行绑定,接口也好,实际实现类也好,就在Spring配置一下就可以了。
而Spring最核心的便是面向接口编程和 IOC,没有了面向接口编程,用一个 A a=new A() 来实例化一个Class,有什么不可以呢?少写了一行代码,引入了一个重量级的Spring,究竟为啥利用Spring呢?

对付Hibernate的盛行,则是由于开拓职员和客户,对付Entity EJB(实体EJB)臃肿的身材及支配的困难,是在极度失落望感情下造成的。
既然是轻量级办理方案,那么分布式就不是可选项,没有分布式,那么EJB就无用 武之地了。
话又说回来了,Rod Johnson前些年就由于强调绝大部分企业运用是不须要分布式的,从而推出了自己轻量级的Spring办理方案。
但是最近一年,随着云打算架构的兴起, 架构是否支持分布式,又是必选项了。
技能架构的选型,就跟法国巴黎盛行时装一样,今年盛行短袖,明年盛行下摆,真是范例的十年河东,十年河西。
以是,像 SOA、云打算、SaaS、物联网这些大名词,不仅会给客户带来很大的困惑,同样也会给程序员、系统剖析师、系统架构师、技能总监带来困惑。
从肯定到否 定,再到自我否定,真是符合大自然螺旋式上升的发展规律。

而对付Struts,它一经推出,险些打败了当时的所有竞争对手。
Struts的伟大之处,在于它对网页数据的动态绑定。
虽然数据绑定不是一个新名 词,微软在1991年推出Visual Basic1.0的时候,就创造性地发明了让VB程序员又爱又恨的数据绑定,但是对付Web 编程,Struts也还是把数据绑定首次运用到了Web编程上。
它能够让人们用Set和Get的形式取得网页数据,而不是单一的黑盒式的 request.getParameter(),从而使得网页数据取值进入面向工具(OO)化时期。

Struts、Hibernate以及Spring本身都是制作精良的框架,但是对付自己产品和项目的运用,一经整合在一起,却不一定很适用。
比如 说,对付数据库干系的MIS(管理信息系统)系统中,增加、修正、删除、查询功能是最基本、最常见、必不可少的。
对付这些最基本的功能,不同的架构师,则 会做出不同的选择。
有的架构师,选择了自动天生的理念,做一个代码自动天生器,设计好数据库表构造,单击一个脚本,或者用Eclipse插件的形式,做个 图形化天生界面,自动天生SSH框架,完成数据库的增加、修正、删除、查询操作。
这么做的好处是数据库修正了,代码自动生造诣可以了,使得程序员不用再维 护这些无聊的代码。
不过毛病也是致命的,一是随着Struts、Hibernate、Spring的升级,这个工具也不得不随着升级,而做这个工具的程序 员,可能早就离开公司了,后续版本无法掩护;二是如果有的业务逻辑跟这些天生的代码有交叉,数据库变更后,代码也无法再次天生了。
三是公司的系统架构,则 被严重限定在SSH架构根本上,再也无法改变。
有人会问:纵然限定在这三种架构上,有何不好吗?假设有客户问,你的框架支持云打算吗?你总不能说”由于 Struts、Hibernate、Spring 不支持云打算架构,以是我也不支持”以此取得客户包涵吧。
因此,依赖于第三方架构的产品体系架构,随着韶光的推移,受到的限定会越来越大。

来源:http://developer.51cto.com/art/201908/601795.htm