`
Tyrion
  • 浏览: 261561 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

也谈Spring,为何用它?

    博客分类:
  • Java
 
阅读更多

一个老生常谈的话题,最近出去面试,十之八九还会问这个,今天在博客园里有人说Spring的问题,忍不住点进去看了看,感觉没说出个所以然,所以写篇小文谈谈我的看法。

 

Spring的由来在其作者Rod Johnson的两本名著(《Expert One-on-One J2EE Development without EJB》和《Expert One-on-One J2EE Design and Development》)中讲得清清楚楚,这里所说的大部分是在拾人牙慧,没办法,多年前的东西现在还是需要重复。

从历史上看,Spring是在对当时横行Java世界的企业级应用的标准解决方案EJB的反叛中产生的。如果你对EJB是什么不清楚的话,没关系,反正在我看来这玩意儿就是个怪物,绝大部分企业应用场景下根本不需要它。这么说吧,从国外到国内,用过EJB的人几乎都会有一大堆血泪般的控诉(这里指的是EJB1和EJB2,我承认EJB3改进了很多),这是一个规范复杂丑陋难以理解、侵入式、难测试、生产率低的被厂商炒作出来的东西,看看EJB1、EJB2的规范文档后会发现其已完全背离简化企业应用开发的初衷(对于EJB的声讨,翻翻Javaeye在03年左右的帖子可以看到很多,这里不再赘述)。

EJB缺点很多,但绝非一无是处,要不那么多项目强忍着用它完全是找虐。它还是提供了很多有价值的东西,如声明性事务、O/R Mapping、各种池的管理、集群、远程调用等,这些是在企业应用开发中经常会用到的,理论上说EJB提供的这些可以提高生产率,让开发者分离关注点,将更多精力放在业务梳理和实现上,而不必太过操心这类所有JavaEE项目中通常都需要考虑的东西。

所有这些通用的东西就叫企业级服务,当时能够提供这些企业级服务的基础设施就是EJB容器。在市场上只有EJB时是这样的局面:你要么全部接受EJB的这一套复杂繁琐的规范,要么只能从头一步步自己实现所有企业级服务。

面对这种两难困境,Spring出现了,可以说它解放了生产力,给开发人员提供了一个更光明的未来。Spring是一个轻量级的无侵入的容器。所谓”容器“说白了就是代码运行的框架。那么何为轻量级,何为重量级?其实很难给出准确定义,有人开玩笑说“将技术规范文档放称上称一下,超过一斤的就是重量级,否则就是轻量级大笑“,我的理解实际上就两点——无侵入、方便测试,满足这两点的就算轻量级。

在我看来Spring框架的核心原理就两条——IOC和AOP,基于POJO实现的依赖注入和基于代理的方式实现AOP。通过IOC实现功能模块之间的低耦合(以依赖注入的方式交由容器来管理模块之间的依赖),通过AOP实现功能模块之内的高内聚(以AOP的方式向功能内部注入其所需要的通常的企业级服务),从而达到功能模块的高内聚和低耦合,提高模块的独立性,奠定高质量软件架构的基础。以此为内核Spring作为万能黏合剂,将上述EJB提供的对应用开发有价值的企业级服务(如声明式事务、O/R Mapping、各种池管理等)的各类开源解决方案粘合到Spring中,从而替代EJB这种重型方案并且还提供易扩展、易测试等额外好处。

当然Spring发展到今天,本身已经集成了一大堆各类业务问题的解决方案,使得它成为一个几乎可以扫射一般中小型企业应用中遇到的绝大部分问题的强大武器。这一点还得感谢开源社区,正是因为社区对Spring理念的认同以及认同之后所贡献的各类业务问题的优秀解决方案,这种良性互动造成今天JavaEE领域框架市场上的王者之尊。

 

回到本文标题,为何用它?

看起来一个应用如果什么框架都不用倒像是最简单的,所有技术问题自己实现嘛(也就是重复造轮子)。但经过实践证明容器是非常重要的,连这都不要的话是过犹不及了(如果你做过一些仅仅使用java原生态技术的项目的话应该会对此深有体会)。有一个容器存在,它可以提供企业级服务(避免二次开发)、一致的服务访问方式、可插拔性、一站式购物体验(找到容器就可以找到容器提供的所有服务)等等。

明确了需要一个容器之后,还剩下一个选择的问题,究竟选择一个轻量级的还是EJB的容器?

EJB容器缺点上面说过了,但EJB有专门的厂商支持(你或者你的客户有足够的Money的话)。而开源的轻量级容器很多,为什么要选择Spring?我的答案除了对于Spring框架理念的认同之外,更重要的一点是它的社区活跃,碰到的大部分问题能直接在网上获得答案。

1
3
分享到:
评论
7 楼 Tyrion 2013-09-06  
lvwenwen 写道
lz,博客园讨论spring的链接发下

呵呵,是个搞.net的人说的,http://www.cnblogs.com/COIN/p/3261636.html
6 楼 lvwenwen 2013-09-06  
lz,博客园讨论spring的链接发下
5 楼 windshome 2013-09-06  
对Spring,甚至Java世界目前的做法我抱慎重态度,但是又希望这个东西能越做越好。

如果Spring能够抓住自身的重点,那么还是大有发展的。

IoC和AOP是毫不相关的两个事情,揉到一个框架里叫Spring,有点白菜拌花生米的感觉,最好是分裂成两个框架来做。

关于AOP

我甚至觉得,Spring拿来了别人的AOP来搞,其实很没有意思,并且对AOP没有什么大的发展和贡献。只是因为Spring名气大,很多人因为Spring接受了AOP,但是AOP的弊端是什么?谁思考过?

回想十年前,刚刚看到AOP的概念,我也很兴奋,打算采用,但是考虑了一大圈,还是老老实实没敢采用,就是考虑到了它的弊端。


关于IoC

IoC看上去很概念化,但是究其实质,也就是封装了Java的反射机制。在10年前,我刚刚开始做架构时,做的第一个产品架构,就大量使用了反射机制,的确给带来了很大的架构上的灵活性,做到何种程度了呢?其实也就是在配置中规定了很多全局性的对象的创建方式(之所以第一次看到Spring的介绍,感觉怎么和我的那个产品架构很相似,不过因为我只考虑自己产品的情况,无须考虑通用性,刚开始也无须考虑太多兼容性,所以比较简单,相反,在安全性和健壮性上考虑自问比Spring要多一些)。


感觉Spring在Java反射的基础上做的事情还是稍微有些少,应该再挖掘一下,给上层开发者带来更大的方便。


关于复杂度

我觉得Spring虽然号称轻量级,但是实际上还是过于复杂。因为很难描述清楚这个东西(兴许是我才疏学浅,大家不要笑我,因为之前不做J2EE方面,所以要允许我慢慢摸索),我感觉,降低复杂度是Spring的一个很迫切的事情。


怎样降低复杂度呢?第一是把IoC、AOP等不同的东西分离。因为这本身就不是一件事(不要说都是为了简化业务逻辑啊,这是架构的最终目标,不是一个架构或部件的实际任务)。

分离后,应该是分为架构层和工具层两种。这两个层应该由不同的两个小组来完成,实在不行的话,也应该当成不同的两个任务或项目来做。

架构层的目标是建立一套在处理业务时,犹如身使臂,臂使手一样灵活自如的机制,使控制流和数据流在其中运转。架构层又分为IoC的架构和AOP的架构,如上,也应该当成两个不同的任务来做。

工具层没有什么好说的,为了支撑框架的运转,需要一部分组件工具,为了辅助开发者,需要更多更多的工具,但是这个应该分开。支撑框架的工具,可以由开源组织来设计开发,辅助开发者的工具,就不要掺和太多,实在需要的话,应该当做单独的任务或项目。


















4 楼 Tyrion 2013-08-16  
freezingsky 写道
之前面试也遇到过这样的问题,也是问为什么觉得spring好?当然,我不会从那位大师那本书的内容里搬出一堆。但回答下来大致是如下几点:
1.非侵入式。这对于开发不管是基本web还是桌面的来说,可以摒弊运行环境的影响,只关注于自己代码逻辑的实现。
2.IOC和AOP。然后回答一堆关于什么叫IOC,AOP以及二者有什么用之类的问题,答案的内容基本上也集中更方便业务方面的考虑,而将一些验证或者是logger方面的东西交给AOP来完成,大致云云。
3.spring中设计到的相关的设计模式。往往这里会涉及到谈论相关模式的使用场景,甚至会要求画出相关的类图等UML方面的内容。
4.spring用过了,是否了解IOC和AOP的实现原理?如果没有spring,能否自己设计一个简单的IOC容器,以及AOP的简单实现?这方面的东西如果平常喜欢研究的话,很容易就能回答出来,并且也能用伪代码描述出大致的过程。
5.由spring的问题,往往会引申出所谓的struts2,hibernate,mybatis之类内容。特别是hiberante方面,容易涉及到一些所谓的优化内容,以及为什么这么优化以及优化方面与JDBC的关系。
剩下的,留给其他人补充。。。

其实这类问题本就见仁见智的,看你是站在一般开发人员还是架构师还是项目经理的角度,由此所关心的框架在实际项目中的权衡利弊的侧重点是不一样的。
3 楼 Tyrion 2013-08-16  
lvwenwen 写道
那位大师那本书的,那本书啊?

《Expert One-on-One J2EE Development without EJB》和《Expert One-on-One J2EE Design and Development》
2 楼 lvwenwen 2013-08-16  
那位大师那本书的,那本书啊?
1 楼 freezingsky 2013-08-16  
之前面试也遇到过这样的问题,也是问为什么觉得spring好?当然,我不会从那位大师那本书的内容里搬出一堆。但回答下来大致是如下几点:
1.非侵入式。这对于开发不管是基本web还是桌面的来说,可以摒弊运行环境的影响,只关注于自己代码逻辑的实现。
2.IOC和AOP。然后回答一堆关于什么叫IOC,AOP以及二者有什么用之类的问题,答案的内容基本上也集中更方便业务方面的考虑,而将一些验证或者是logger方面的东西交给AOP来完成,大致云云。
3.spring中设计到的相关的设计模式。往往这里会涉及到谈论相关模式的使用场景,甚至会要求画出相关的类图等UML方面的内容。
4.spring用过了,是否了解IOC和AOP的实现原理?如果没有spring,能否自己设计一个简单的IOC容器,以及AOP的简单实现?这方面的东西如果平常喜欢研究的话,很容易就能回答出来,并且也能用伪代码描述出大致的过程。
5.由spring的问题,往往会引申出所谓的struts2,hibernate,mybatis之类内容。特别是hiberante方面,容易涉及到一些所谓的优化内容,以及为什么这么优化以及优化方面与JDBC的关系。
剩下的,留给其他人补充。。。

相关推荐

    浅谈 Spring 原理 透析,ioc aop

    浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...

    浅谈Spring中的Quartz配置

    在Spring框架中,Quartz是一个常用的作业调度库,它允许开发者定义定时任务并按照预定的时间间隔执行。Quartz与Spring的集成使得我们可以充分利用Spring的IoC(Inversion of Control)和AOP(Aspect-Oriented ...

    浅谈spring 常用注解

    浅谈Spring常用注解 浅谈Spring常用注解是Spring框架中的一些基本概念,了解这些概念对于 MASTERING SPRING Framework非常重要。本文将对Spring中常用的注解进行分类和介绍,并对每个注解的使用进行解释。 一、...

    浅谈Spring+Hibernate整合(共16页).doc

    同时,Spring 的其他功能,如 JdbcTemplate、JPA 等,也可以与 Hibernate 并存,根据项目需求灵活选择数据访问策略。 总之,Spring 和 Hibernate 的整合是 Java Web 开发中的常见实践,它利用 Spring 的强大管理...

    Spring Boot浅谈(是什么/能干什么/优点和不足).docx

    Spring Boot的核心优势在于其自动化配置,它极大地减少了XML配置文件的使用,转而倾向于Java配置和基于注解的编程。 1. **Spring Boot是什么,解决哪些问题** - **编码变简单**:Spring Boot通过提供默认配置和...

    浅谈Spring Cloud Ribbon的原理

    浅谈Spring Cloud Ribbon的原理 Spring Cloud Ribbon是一个基于Netflix的开源项目,主要提供客户端的软件负载均衡算法,将中间层服务连接在一起。Ribbon客户端组件提供了一系列完善的配置项,如连接超时、重试等。...

    浅谈Spring Data如何简化数据操作的方法

    首先,Spring Data支持多种NoSQL数据库,例如MongoDB(文档数据库)、Neo4j(图形数据库)、Redis(键/值存储)和Hbase(列族数据库),同时也支持关系数据存储技术,如JDBC和JPA。对于JPA支持,Spring Data JPA提供...

    Spring Boot面试题(92题)

    Spring Boot 是一种基于 Java 的框架,旨在简化Spring框架的初始设置和常规配置。Spring Boot的出现是为了应对Spring项目日益复杂的构建和配置问题。在传统的Spring项目中,开发者需要手动添加构建路径、Maven依赖...

    Springcloud学习笔记.md

    Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...

    浅谈spring容器中bean的初始化

    在Spring框架中,Bean的初始化是一个关键的概念,它涉及到Bean的生命周期管理以及Spring容器如何创建、配置和管理这些Bean。本文将深入探讨Spring容器中Bean的初始化过程。 首先,Spring容器根据XML配置文件(如`...

    夏昕与林信良谈Spring框架_CSDN 博文视点名家讲坛活动.doc

    这是因为一年的实际开发经验能为理解Spring的基础架构奠定基础。在适当的资料辅助下,学习Spring不会过于困难。 【选择Spring和其他框架的依据】林信良强调,选择框架时要考虑稳定性、人员培训和文档支持。例如,...

    ibatis_spring源代码

    当我们谈到`iBatis` 和 `Spring` 的整合时,意味着我们可以利用两者的优点,构建一个高效、灵活且易于维护的系统。 整合`iBatis` 和 `Spring` 主要涉及以下几个关键知识点: 1. **数据源配置**:在整合过程中,...

    Test05_Spring_Context_XML.rar

    当我们谈到“Spring工程的初始化模块与基础配置”时,我们通常指的是设置Spring IoC(Inversion of Control)容器,该容器负责管理对象的生命周期和依赖关系。在XML配置文件中,我们可以通过`...

    activityMQ调用示例,spring集成示例

    当我们谈到“activityMQ调用示例,spring集成示例”,这意味着我们将探讨如何将ActivityMQ与Spring框架整合,以实现高效、可扩展的系统架构。 首先,我们需要理解ActivityMQ的核心概念。ActivityMQ是一个基于Apache...

    浅谈spring中用到的设计模式及应用场景

    浅谈Spring中用到的设计模式及应用场景 Spring 框架是 Java 企业级应用程序的核心组件之一,它提供了强大的功能和灵活的架构来简化企业级应用程序的开发。Spring 框架使用了多种设计模式来实现其功能,本文将对 ...

    浅谈spring和spring MVC的区别与关系

    "Spring与Spring MVC的区别与关系" Spring是一个开源框架,功能主要是依赖注入和控制反转。依赖注入有三种形式:构造注入、setter注入和接口注入。控制反转则主要是起到操控作用,把对象的创建、初始化、销毁交给...

    浅谈SpringBoot2.4 配置文件加载机制大变化

    一、为什么要进行这些更改 随着最新版本 Spring Boot 的发布,Spring 一直在努力提升对 Kubernetes 的原生支持。在 Spring Boot 2.3 中,官方增加了 Kubernetes Volume 的配置支持,但是未能实现。Volume 配置挂载...

    java中spring里实现多线程

    当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和协调并发执行的任务。这涉及到Java的并发API以及Spring对这些API的包装和扩展。 首先,让我们了解Java中的多线程基础。在Java中,...

    浅谈Springboot之于Spring的优势

    浅谈Springboot之于Spring的优势 ...同时,也欢迎各位参阅本站其他相关专题,如Spring的编程式事务和声明式事务详解、Spring spel表达式使用方法示例、浅谈Spring Boot微服务项目的推荐部署方式等。

Global site tag (gtag.js) - Google Analytics