`

Java杂谈(十一)--Spring

    博客分类:
  • java
阅读更多


    引用《Spring2.0技术手册》上的一段话:  
   Spring的核心是个轻量级容器,它是实现IoC容器和非侵入性的框架,并提供AOP概念的实现方式;提供对持久层、事务的支持;提供MVC Web框架的实现,并对于一些常用的企业服务API提供一致的模型封装,是一个全方位的应用程序框架,除此之外,对于现存的各种框架,Spring也提供了与它们相整合的方案。  
接下来笔者先谈谈自己的一些理解吧,Spring框架的发起者之前一本很著名的书名字大概是《J2ee Development without EJB》,他提倡用轻量级的组件代替重量级的EJB。笔者还没有看完那本著作,只阅读了部分章节。其中有一点分析觉得是很有道理的:  
 
   EJB里在服务器端有Web Container和EJB Container,从前的观点是各层之间应该在物理上隔离,Web Container处理视图功能、在EJB Container中处理业务逻辑功能、然后也是EBJ Container控制数据库持久化。这样的层次是很清晰,但是一个很严重的问题是Web Container和EJB Container毕竟是两个不同的容器,它们之间要通信就得用的是RMI机制和JNDI服务,同样都在服务端,却物理上隔离,而且每次业务请求都要远程调用,有没有必要呢?看来并非隔离都是好的。  
 
   再看看轻量级和重量级的区别,笔者看过很多种说法,觉得最有道理的是轻量级代表是POJO + IoC,重量级的代表是Container + Factory。(EJB2.0是典型的重量级组件的技术)我们尽量使用轻量级的Pojo很好理解,意义就在于兼容性和可适应性,移植不需要改变原来的代码。而Ioc与Factory比起来,Ioc的优点是更大的灵活性,通过配置可以控制很多注入的细节,而Factory模式,行为是相对比较封闭固定的,生产一个对象就必须接受它全部的特点,不管是否需要。其实轻量级和重量级都是相对的概念,使用资源更少、运行负载更小的自然就算轻量。  
 
   话题扯远了,因为Spring框架带来了太多可以探讨的地方。比如它的非侵入性:指的是它提供的框架实现可以让程序员编程却感觉不到框架的存在,这样所写的代码并没有和框架绑定在一起,可以随时抽离出来,这也是Spring设计的目标。Spring是唯一可以做到真正的针对接口编程,处处都是接口,不依赖绑定任何实现类。同时,Spring还设计了自己的事务管理、对象管理和Model2 的MVC框架,还封装了其他J2ee的服务在里面,在实现上基本都在使用依赖注入和AOP的思想。由此我们大概可以看到Spring是一个什么概念上的框架,代表了很多优秀思想,值得深入学习。笔者强调,学习并不是框架,而是框架代表的思想,就像我们当初学Struts一样……  
 
   1.Spring MVC  
   关于IoC和AOP笔者在上篇已经稍微解释过了,这里先通过Spring的MVC框架来给大家探讨一下Spring的特点吧。(毕竟大部分人已经很熟悉Struts了,对比一下吧)  
众所周知MVC的核心是控制器。类似Struts中的ActionServlet,Spring里面前端控制器叫做DispatcherServlet。里面充当Action的组件叫做Controller,返回的视图层对象叫做ModelAndView,提交和返回都可能要经过过滤的组件叫做Interceptor。  
 
   让我们看看一个从请求到返回的流程吧:  
   (1) 前台Jsp或Html通过点击submit,将数据装入了request域  
   (2) 请求被Interceptor拦截下来,执行preHandler()方法出前置判断  
   (3) 请求到达DispathcerServlet  
   (4) DispathcerServlet通过Handler Mapping来决定每个reuqest应该转发给哪个后端控制器Controller  
   (5) 各式各样的后端控制器Controller来处理请求,调用业务层对象来处理业务逻辑,然后返回一个ModelAndView对象  
   (6) 当Controller执行完毕,Interceptor会调用postHandle来做后置处理  
   (7) ModelAndView代表了呈现画面是使用的Model数据对象和View对象,由于只能返回一个对象所有起了这个名字封装这两个对象。  
   (8) 由ViewResolver对象来解析每个返回的ModelAndView对象应该呈现到哪一个视图(Jsp/Html等)中(包括Exception Resolver)  
   (9) 当View绘制完成之后Interceptor又会跳出来执行它的afterCompletion方法做善后处理。当然Interceptor的行为完全是配置的而不是强制的。  
 
 
   这样一个完整的流程就这样结束了,个人感觉Spring的MVC框架稍显复杂,不像Struts-1那么容易上手。不管是Controller、Model、ViewRosovler、Handle Mapping还是View,Spring MVC框架都已经为你提供了多种实现,想最大程度的减少程序员的编码,增加框架的适用性。大家有兴趣可以继续深入研究哈!  
 
   2.Spring AOP  
   记得最初笔者请教他人Spring是一个什么东西的时候,每个人都会提到AOP这个词语。笔者在上一篇已经解释过AOP基本原理,这次来跟大家说说Spring的AOP编程吧。不同的AOP框架会有其对AOP概念不同的实现方式,主要的差别在于所提供的Pointcut、Aspects的丰富程度,以及它们如何被织入应用程序、代理的方式等等。先熟悉一下AOP中的几个重要概念:  
   (1) Cross-cutting:横切,说白了就是需要统一处理的集合  
   (2) Aspects:将散落各处的横切收集起来,设计成各个独立可重用的对象称为Aspects。  
   (3) Advice: 对横切的具体实现,即等待插入一段逻辑。  
   (4) Joinpoint:Advice插入流程的时机点。  
   (5) Pointcut: 用于选择Joinpoint的程序结构,可以通过Annotation或者XML实现。  
   (6) Weave: Advice被应用至对象之上的过程称之为织入,有编译期、类加载期、运行期三种时间点策略。  
 
   如果你采用实现接口的方式,Spring会在执行时期适用java的动态代理,如果不实现接口,Spring会使用CGLIB产生代理类。AOP的概念很大很泛,而Spring只使用了其中的部分特性,毕竟Spring的目标是轻量级框架,比如它只支持对Method的Joinpoint,而不支持对Field的Joinpoint,理由是为了封装性。  
    
   其实我们可以把概念看得简单一点,AOP的目的是减少冗余代码,增强对较大项目的全局监控。Spring利用AOP可以规定一个集合和一套规则,在这个集合里所有的方法被invoke即调用的时候,都必须按照那套规则走一遍。那么首先对其中10个方法都要用到的处理代码就只用写一遍,如果是这10个方法来了就织入这段代码;其次,按照规则,也许所有的牵扯某个模块的方法调用的时候,我都需要做日志或者进行验证,那么我只要立足于这个集合的入口和出口,管他从哪里来去哪里,都能被有效的监控。我监控的可能不止是某个方法单独的行为,我还可以加入对流程控制的监控规则。例如是论坛,我规定注册了才能登录,而登录后才能发帖回帖下资源,于是所有这类流程都会被收集到我眼皮地下通过。  
 
   PS:笔者最近忙于找工作的事,没有太多经历在论坛跟大家整理自己的笔记。最近也只是接触Spring的MVC比较多,对于Spring的其他特性,还没有更多的去实践,所以仅仅是泛泛而谈,只是介绍一个印象罢了。还是那句话,我们学习一个框架不是如何使用,而是它所带来的优秀的思想和理念,这比如何使用这个框架更有意义得多

分享到:
评论

相关推荐

    spring杂谈 作者zhang KaiTao

    作者解释了这两个概念,以及如何在Spring中实现DI,包括使用XML配置、注解和Java配置的方式。 SpringMVC与Spring整合是Web应用开发的常见场景。作者讨论了SpringMVC与Hibernate的集成,以及在这个过程中可能遇到的...

    Spring杂谈

    Spring框架是Java开发领域中最重要的技术之一,它是一个开源的轻量级框架,提供了全面的编程和配置模型。Spring框架的核心特性包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问抽象等。本杂谈将围绕...

    spring 杂谈,求扩散

    Spring是Java领域中一个广泛应用的轻量级框架,它提供了丰富的功能,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。本文将深入探讨Spring的一些关键概念和特性,以帮助开发者更好地理解和利用这个强大的...

    java_学习资料

    - **Valuestack杂谈**:介绍ValueStack的作用和使用方式。 - **主题和模板**:定制视图的外观样式。 - **表单标签**:如`s:checkbox`、`s:radio`等。 - **Dojo标签**:用于生成Ajax交互的UI组件。 **整合SSHA** - ...

    组建java团队.pdf

    在组建Java开发团队的过程中,涉及到多个关键步骤和知识点。以下是对这些知识点的详细解读: 1. 组建团队的过程: 组建团队首先要确定使用的技术栈,以适应业务需求和项目规模。团队成员的角色通常包括不同级别的...

    Learn-More-Do-Less:Java资料库

    Java 知识点,持续迭代中。 如果对你有帮助请点下 Star,有疑问欢迎提有好的想法请提 设计模式 源码分析 JDK 线程相关源码 框架使用 web 层框架 Spring MVC ...杂谈 从架构演变到展望未来 从Synchro

    j2ee杂谈

    "j2ee杂谈"这个主题涵盖了在J2EE开发过程中可能遇到的各种问题和最佳实践。 首先,让我们来深入探讨一下EJB(Enterprise JavaBeans)。EJB是J2EE的核心组件之一,它为开发服务器端的业务逻辑提供了标准的组件模型。...

    java8集合源码分析-interview-resources-zhCN:技术资源,整理自用

    java8 集合源码分析 interview-resources-...Spring NIO DB及ORM 实用工具 设计模式 分布式 架构 算法 网络 Linux IDE JAVA 新版本 震惊,JAVA9已经不推荐使用 更震惊,预计9月份就要出JAVA11了 杂谈 正版电子书推荐

    系统框架权限设计杂谈论文

    工具方面,很多框架和库提供了权限管理的支持,例如Spring Security(Java)和ASP.NET Identity(.NET)。这些工具提供了一套完整的解决方案,包括身份验证、授权、会话管理等,使得开发者可以方便地集成权限控制到...

    SSH开发的一个在线服装商店

    SSH框架是Java Web开发中广泛使用的三大开源框架的组合,包括Spring、Struts2和Hibernate。这个在线服装商店项目就是基于这些技术构建的电子商务平台。接下来,我们将详细探讨SSH框架的各自职责以及如何在在线购物...

    基于规则引擎的消息中心模块的设计与实现

    - **主体架构选择**:论文选择了传统的SSH(Spring+Struts+Hibernate)架构作为基础架构,这是一套成熟的Java Web应用开发框架组合,可以有效地支持Web应用的开发。 - **规则引擎集成**:论文引入了Drools规则引擎,...

    localhost-8080.github.io:基于 VuePress 和 GitHub Pages 的技术博客

    localhost-8080 本地煮鸡:8080技术博客架构Vuepress + GitHub Pages / Netlify内容Java 程序设计Kotlin 程序设计C 程序设计Web 技术Spring 技术大数据技术前端技术深度学习软件工程杂谈持续施工中在线展示页面 或,

    ssh框架用struts2+hibernate实现图片的上传源码

    SSH框架是Java Web开发中的一种常见组合,由Struts2、Spring和Hibernate三个开源框架组成。这个框架结合了Struts2的MVC设计模式、Spring的依赖注入(DI)和面向切面编程(AOP)以及Hibernate的对象关系映射(ORM)...

Global site tag (gtag.js) - Google Analytics