鼎鼎大名的Spring框架3.0版在12月5日由其作者之一——Juergen Hoeller先生在博客里宣告问世,并命为里程碑版,给Spring粉丝们带来了震撼的快感。笔者即开“快车”拉了两个包回来,遗憾的是参考文档至今还没有出来(仅有API文档),这为学习Spring 3.0带来了非常大的困难,但没有阻挡笔者对新产品的兴趣。
Spring之父Rod Johnson先生早在2003年就预言EJB将死(观点颇具争议),攻击EJB之臃肿是在虐待程序员。然而EJB 3.0出来后几乎宣判Spring死刑,但自2.0版以后Spring火爆程度已经超过EJB,两者的争斗至今仍不停息,这也是Spring 3.0连文档还没有整理出来就匆匆推出的原因。当然,Spring与EJB有很多各自独特优势之处,例如EJB的分布式运算、标准规范,Spring的IoC、AOP切面编程、偶合集成、MVC等等,取各自之长在企业中应用如虎添翼。Spring目前已经加入了J2EE规范,J2EE世界将更加精彩......
或许是用腻了Struts1那死板的WEB框架,才对Spring MVC爱不释手,尤其是2.5版本以后,支持全注解配置方式,已经使很久没有再写过xml文件了。
3.0版是完全兼容2.5,因此了解2.5版的@MVC则更容易接受。正如Arjen Poutsma小伙子在他的博客里说的那样,3.0时代将集中致力于表述性状态转移(REST,希望我没有翻译错,金山词霸翻译为“休息”)的网络服务和更容易的网络编程。的确增加了更多的控制器类型,并增强了SOAP/WSDL/WS这些基于分布式体系结构。
先回忆下2.5注解方式的@MVC,来一个示例:
@Controller
public class ArticleController{
@RequestMapping("/articleView")
public String getArticle(@RequestParam("id") String id, HttpServletRequest request){
request.setAttribute("article", service.find(Article.class, id));
return "articleView";
}
}
ArticleController没有实现任何接口,是一个最普通不过的pojo,如果浏览器来了articleView.do?id=xxx这个请求,Spring会找到getArticle()这个方法,该方法第一个参数绑定到了URL上的请求参数,第二个是J2EE标准的request对象(可见Spring MVC是非侵入式的,不像变态的Struts2),事实上还可以给定HttpServletResponse,ModelMap,甚至自己的类型,Spring都会为你将值传入进来。通过一个逻辑层service组件根据id参数值去底层查找Article对象,并放入request作用域中,最后返回的是面页视图名,这个例子中是返回到articleView.jsp中。
上例再变通下:
@Controller
public class ArticleController{
@RequestMapping("/articleView_*")
public String getArticle(HttpServletRequest request){
String id = StringUtil.getParam(request.getRequestURI(),"articleView_*");
request.setAttribute("article", service.find(Article.class, id));
return "articleView";
}
}
对于articleView_aaa.do,articleView_bbbb.do,articleView_c5h8j2.do,articleView_xxx.do,这样的请求都会由getArticle()这个方法来应付,是不是很有意思?
Spring 3.0增加了一个@ PathVariable注解来支持可变的请求路径,将上面的代码在3.0版中再变通下:
@Controller
public class ArticleController{
@RequestMapping("/articleView/${id}") //可以接受articleView/aaa.do,articleView/xxx.do...
public String getArticle(@PathVariable String id, HttpServletRequest request){
request.setAttribute("article", service.find(Article.class, id));
return "articleView";
}
}
再变得复杂些:
@Controller
public class ArticleController{
@RequestMapping("/articleList/${pageSize}/channel/*/category/${id}")
public String getArticles((@PathVariable Integer pageSize, @PathVariable int id, HttpServletRequest request){
Integer channelId = StringUtil.getParam(request.getRequestURI(),"channel/*/");
request.setAttribute("articles", service.findScroll(Article.class, pageSize,50,"channel=? and category=?",new Object[]{channelId,id}));
return "articleList";
}
}
它已经灵活到URL地址完全可以自己随意编制。
根据内容协商制的视图解析机制:
2.5版是由@MVC控制器来决定视图解析器,3.0版将变得更加灵活,似乎可以通过扩展名来转到不同的解析器中,例如请求一个.pdf文件将是如何效果呢?3.0版都会带来不可思议的模式。
HTTP方法的转换:
先看前台页面一段Html代码
<form:form method="delete">
<p class="submit"><input type="submit" value="Delete Pet"/></p>
</form:form>
HTTP规范中form表单只有两种方法——POST和GET,而3.0做了一个过滤器,可以转换这些方法至四种——GET, PUT, POST, 和 DELETE。控制器接受请求:
@Controller("/deleteArticle")
public class ArticleController{
@RequestMapping
(method = RequestMethod.DELETE)
public String deleteArticle(@PathVariable String id, HttpServletRequest request){
service.delete(Article.class, id);
return "message";
}
}
3.0版仅在MVC子集中就增加了很多新特性,如果在IoC、AOP等等其它子集所有的变革,绝对可以称得上Srping创始人所述的里程碑版本。3.0版使用的注解列表如下:
• @Autowired
• @Component
• @Controller
• @InitBinder
• @ManagedAttribute
• @ManagedOperation
• @ManagedOperationParameters
• @ManagedOperationParameter
• @ManagedResource
• @PathVariable
• @PostConstruct
• @PreDestroy
• @Repository
• @RequestMapping
• @Required
• @Resource
• @Service
• @Transactional
目前Spring 3版本已经到了M2,应该是M3完成后将推出最终正式版本,我想很快会来临,按照Spring的创始人罗德.约翰逊的预言,未来J2EE应用中Spring+Tomcat将占主导地位,是否引起争议,笔者不敢点评,不过Oracle收购Sun后,Java社区将是如何,还无从知晓,似乎罗德.约翰逊对这宗收购案也有些紧张,因为Oracle不像Sun的第一个谈判者IBM那样有过开放技术的先例(可以回忆下IBM早期的主板总线开放掀起的兼容机潮至今波涛不熄)。目前国内对新东西消化尚慢,我到图书城看了下,Spring 2.5的资料都很难找到。且很多企业都是抱着Struts1.x在做开发,尽管笔者这样说会引来很多争议,但Struts1时代的灭亡只是时间问题。Struts2虽然改进了很多,依笔者看,与Spring MVC相比仍有诸多的不足,尤其看不惯那种变态的侵入模式,看看它把HttpServletRequest、HttpSession、HttpServletResponse等servlet标准组件干成什么样?开源时代,至少我不愿意接受那种变态的潜规则。
笔者早先常用Struts1.x框架,它搭配了一套自己的ActionForm,使得编程工作量增加,虽然可以变通使用自己的Pojo,但对于没有掌握J2EE底层工具类(BeanUtil)的开发人员来说,其类型匹配是非常复杂的事。事实上Spring MVC早在1.x版本就完全使用自己的pojo来对应表单的填充,配上属性编辑器,可以解决类型转换问题,完全实现领域模型驱动的设计模式。由于MVC层的控制器也是Spring容器的Bean而已,因此对整个项目的控制、扩展变得非常容易。同时上文也顺便点评了Struts2,可见Spring MVC在各类MVC框架的优势所在。本身罗德.约翰逊先生是设计模式高手,一个优秀的框架给我们带来的远远不只是开发效率,还有更先进的开发模式和理念...
笔者对Spring框架研究肤浅,待日后了解掌握更多时会常在博客中述之。
张纪豪(zhangjihao@sohu.com),恳请指教!
附:
Juergen Hoeller先生的博客:http://blog.springsource.com/author/juergenh/
Spring 3.0 里程碑版 下载地址:http://www.springsource.com/download/community?project=Spring%20Framework
Spring创始人Rod Johnson先生的博客:博客地址:http://blog.springsource.com/author/rodj/
Rod Johnson——Spring之父
Spring Framework创始人,著名作者。
Rod在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位。更令人吃惊的是在回到软件开发领域之前,他还获得了音乐学的博士学位。
有着相当丰富的C/C++技术背景的Rod早在1996年就开始了对Java服务器端技术的研究。他是一个在保险、电子商务和金融行业有着丰富经验的技术顾问,同时也是JSR-154(Servlet 2.4)和JDO 2.0的规范专家、JCP的积极成员,是Java development community中的杰出人物。
2002年Rod Johnson根据多年经验撰写的《Expert One-on-One J2EE Design and Development》。其中对正统J2EE架构的臃肿、低效的质疑,引发了人们对正统J2EE的反思。这本书也体现了Rod Johnson对技术的态度,技术的选择应该基于实证或是自身的经验,而不是任何形式的偶像崇拜或者门户之见。正是这本书真正地改变了Java世界。基于这本书的代码,Rod Johnson创建了轻量级的容器Spring。Spring的出现,使得正统J2EE架构一统天下的局面被打破。基于Struts+Hibernate+Spring的J2EE架构也逐渐得到人们的认可,甚至在大型的项目架构中也逐渐开始应用。
Juergen Hoeler是SpringFramework的共同作者之一,SpringFramework中的Hibernate相关的API是由Juergen Hoeler完成的。
Rod Johnson的新作《Expert one-on-one J2EE Development without JEB》提出“Without EJB”的观念,让大多数J2EE架构师大为吃惊。正是这样的思想,促使Rod Johnson创建了Spring,真正改变了Java世界。
分享到:
相关推荐
在Spring 5.0.2.RELEASE中,对Web MVC进行了优化,提供了更快的响应速度和更高效的请求处理。同时,对RESTful服务的支持进一步增强,使得构建RESTful API更为便捷。此外,Spring Data模块也有了显著提升,增强了对...
3. **引入ZK**:ZK的整合主要涉及创建ZK的视图组件,并将这些组件与Spring的Bean关联。Spring可以通过ZK的@Wire注解自动将Bean注入到ZK组件中。 4. **配置ZK-Spring**:需要引入ZK-Spring的库,这是一个连接ZK和...
3. **Bean容器**:Spring的Bean容器(ApplicationContext)是核心组件,负责加载配置,创建并管理对象(即Bean)。Bean可以被声明为单例或多例,并可以通过属性注入进行配置。 4. **XML配置与注解配置**:Spring...
本文将围绕"spring-framework-master-2018.1.1.zip"这一版本,对Spring框架进行深入的剖析,带你领略其魅力。 首先,Spring的核心理念是依赖注入(Dependency Injection,简称DI),它使得应用程序的组件之间解耦,...
本书旨在深入剖析Spring Web MVC的核心实现原理和技术细节,帮助读者从源码层面理解Spring Web MVC的工作机制,领略其设计之美。不同于传统的Spring入门指南或应用教程,本书定位为一本高级技术专著,特别适合那些想...
Spring框架是Java开发中的一个核心组件,以其丰富的功能和灵活性深受开发者喜爱。它是一个开源的、轻量级的容器,主要解决企业应用...同时,随着学习的深入,读者将能领略到Spring带来的开发效率提升和应用的可扩展性。
本篇文章将深入探讨"jastar-wang-demo-springdata-mongo-master.zip"这一项目,带你领略Spring Data MongoDB的精髓。 首先,"jastar-wang-demo-springdata-mongo-master.zip"是一个基于Spring Boot的示例项目,它...
在这个基于SpringMVC+Spring+MyBatis框架的个人博客网站项目实践中,我们不仅能够深入理解Web开发的核心技术,还能领略到人工智能在实际应用中的潜力。这个项目是为IT专业学生设计的期末作业,旨在提升他们的综合...
"chap01 领略清晰的MVC流程----Struts讲解技术资料.pdf"深入剖析了Struts1如何实现Model-View-Controller模式,帮助开发者更好地理解和运用这个框架。 Struts2作为Struts1的升级版,它融合了WebWork框架的优势,...
《Spring PetClinic项目详解:领略Spring框架与Java后端开发的魅力》 Spring PetClinic项目是Spring官方推出的一个小型示例应用,旨在帮助开发者更好地理解和掌握Spring框架的核心功能和特性。这个项目不仅是一个...
本书从源代码分析入手,对Spring的架构原理和设计思想进行了全面剖析,不仅能让我们更深入、更彻底地认识Spring,领略Spring的架构之美和设计之美,而且更重要的是,它将全面提升我们的Spring开发技能。., ——...
Spring 源码是 Java 开发者深入了解这个广泛使用的开源框架内部工作原理的重要...通过阅读源码,我们能领略到 Spring 设计模式的巧妙运用,例如工厂模式、代理模式、装饰器模式等,以及它如何实现高可扩展性和灵活性。
《Spring框架3.2.4源码解析》 Spring框架是Java开发中不可或缺的重要组成部分,其3.2.4版本更...通过对`spring-framework-3.2.4.RELEASE`中的各个模块进行分析,开发者可以逐步揭开Spring的神秘面纱,领略其设计之美。
Spring MVC是Spring框架中的Web层组件,它提供了一种模型-视图-控制器(Model-View-Controller, MVC)的架构模式,用于构建Web应用程序。Spring MVC通过DispatcherServlet、HandlerMapping、ViewResolver等组件协同...
2. **Spring MVC**:作为Spring的一部分,Spring MVC是一个用于构建Web应用程序的轻量级MVC(Model-View-Controller)框架。它处理HTTP请求,将数据模型传递给视图,并处理用户交互。在这个古诗词学习平台上,Spring...
chap01 领略清晰的MVC流程----Struts讲解技术资料 chap02 体验控制反转的理念----Spring介绍技术文档 chap03 感悟Hibernate操作数据的方便技术资料 chap04 SSH互整合技术资料
在"领略清晰的MVC流程----Struts讲解技术资料.pdf"中,可能会涵盖Struts的动作(Action)、配置文件、表单(Form Bean)、结果映射(Result Mapping)以及JSP标签库等内容。 2. **Spring**: Spring是一个全面的...
总之,Spring框架是一个庞大且功能丰富的生态系统,深入研究其源码不仅可以提高我们的编程技能,更能让我们领略到优秀软件设计的魅力。在“spring-source-study”这个学习记录中,你将有机会逐步掌握Spring的每一个...
Spring Boot是用来简化Spring应用初始搭建以及开发过程的全新框架,被认为是Spring MVC的“接班人”,和微服务紧密...通过本门课程的学习,你将学会如何使用Spring Boot快速构建应用程序,初步领略Spring Boot的魅力!
本文将深入探讨如何利用Java技术栈,特别是Spring、SpringMVC和MyBatis这三大框架,构建一个高效、可维护的后台管理系统,以"adminlogin的替身.zip"为例,带领读者领略这一过程。 首先,Spring框架是Java领域中的...