大部分项目都少不了Spring的身影,为何你们对他如此青睐,并且对他的追捧丝毫没有减退之势呢html
Spring是什么:git
Spring是一个轻量级的DI和AOP容器框架。程序员
说它轻量级有一大部分缘由是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用通常不依赖于spring的类。面试
DI:称做依赖注入(Dependency Injection),和控制反转一个概念,具体的讲,当一个角色须要另一个角色协助的时候,在传统的程序设计中,一般有调用者来建立被调用者的实例。可是在spring中建立被调用者将再也不有调用者完成,所以叫控制反转。建立被调用对象有Spring来完成,在容器实例化对象的时候主动的将被调用者(或者说它的依赖对象)注入给调用对象,所以又叫依赖注入。ajax
AOP:Spring对面向切面编程提供了强有力的支持,经过它让咱们将业务逻辑从应用服务(如事务管理)中分离出来,实现了高内聚开发,应用对象只关注业务逻辑,再也不负责其它系统问题(如日志、事务等)。Spring支持用户自定义切面。spring
面向切面编程是面向对象编程的有力补充。面向对象编程将程序分红各个层次的对象,面向切面的程序将运行过程分解成各个切面。AOP是从运行程序的角度去考虑程序的结构,提取业务处理过程的切面,OOP是静态的抽象,AOP是动态的抽象,是对应用执行过程的步骤进行抽象,从而得到步骤之间的逻辑划分。容器:Spring是个容器,由于它包含而且管理应用对象的生命周期和配置。如对象的建立、销毁、回调等。数据库
框架:Spring做为一个框架,提供了一些基础功能,(如事务管理,持久层集成等),使开发人员更专一于开发应用逻辑。apache
看完了Spring是什么,再来看看Spring有哪些优势编程
1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,下降组件之间的耦合性,让咱们更专一于应用逻辑服务器
2.能够提供众多服务,事务管理,WS等。
3.AOP的很好支持,方便面向切面编程。
4.对主流的框架提供了很好的集成支持,如Hibernate,Struts2,JPA等
5.Spring DI机制下降了业务对象替换的复杂性。
6.Spring属于低侵入,代码污染极低。
7.Spring的高度可开放性,并不强制依赖于Spring,开发者能够自由选择Spring部分或所有
Struts2 是一个至关强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优势,同时作了至关的改进。Struts2如今在Java Web开发界的地位能够说是大红大紫,从开发人员的角度来分析,Struts2之因此可以如此的深刻开发人员之心,与其优良的设计是分不开的。
一、Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员能够很好的掌控开发的过程。
我在项目开发过程当中,一个具体的功能的开发流程是:拿到一个具体的功能需求文档和设计好的前台界面(在开发中我不负责设计页面),分析须要从前台传递哪些参数,肯定参数的变量名称,在Action中设置相应的变量,这些参数在前台如何显示,并将页面上的一些控件适当使用Struts2提供的服务器端控件来代替,编写Action对应的方法来完成业务逻辑,最后,作一些与配置文件相关的设置。固然实际的开发比这个过程要复杂,涉及到数据库,验证,异常等处理。可是使用Struts2进行开发,你的关注点绝大部分是在如何实现业务逻辑上,开发过程十分清晰明了。
二、使用OGNL进行参数传递。
OGNL提供了在Struts2里访问各类做用域中的数据的简单方式,你能够方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。
三、强大的拦截器
Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是经过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,能够将一些通用的功能如:登陆验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。
四、易于测试
Struts2的Action都是简单的POJO,这样能够方便的对Struts2的Action编写测试用例,大大方便了Java Web项目的测试。
五、易于扩展的插件机制
在Struts2添加扩展是一件愉快而轻松的事情,只须要将所须要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中做一些简单的设置就能够实现扩展。经常使用的Struts2的扩展能够经过这个连接找到:
http://cwiki.apache.org/S2PLUGINS/home.html
六、模块化
Struts2已经把模块化做为了体系架构中的基本思想,能够经过三种方法来将应用程序模块化:
将配置信息拆分红多个文件
把自包含的应用模块建立为插件
建立新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。
七、全局结果与声明式异常
为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程当中出现指定异常时,能够跳转到特定页面,这一功能十分实用。
咱们用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 ,而后直接返回响应文本便可。送上一段代码:
@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”;
}
技术的提高是须要下苦工,须要坚持不懈的努力。就好比下面的分享的这些技术点,是否都学会并掌握了呢?如须要如下图谱以及跟多提高架构技术的资源可加入个人粉丝Qqun:855801563。我花了将近一个月时间搜集整理了一套架构技术提高知识点讲解以及一些面试题解析和答案免费分享给你们。助力各位程序员朋友突破自我提高技能,实现本身的目标。