框架:spring、springmvc、springboot
先來說說spring、springmvc、springboot的關系。
spring boot只是一個配置工具,整合工具,輔助工具.
springmvc是框架,項目中實際運行的代碼
?
Spring?框架就像一個家族,有眾多衍生產品例如?boot、security、jpa等等。但他們的基礎都是Spring?的ioc和?aop,ioc?提供了依賴注入的容器,?aop解決了面向橫切面的編程,然后在此兩者的基礎上實現了其他延伸產品的高級功能。
Spring MVC提供了一種輕度耦合的方式來開發web應用。它是Spring的一個模塊,是一個web框架。通過Dispatcher Servlet, ModelAndView?和?View Resolver,開發web應用變得很容易。解決的問題領域是網站應用程序或者服務開發——URL路由、Session、模板引擎、靜態Web資源等等。
Spring Boot實現了自動配置,降低了項目搭建的復雜度。它主要是為了解決使用Spring框架需要進行大量的配置太麻煩的問題,所以它并不是用來替代Spring的解決方案,而是和Spring框架緊密結合用于提升Spring開發者體驗的工具。同時它集成了大量常用的第三方庫配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot應用中這些第三方庫幾乎可以零配置的開箱即用(out-of-the-box)。
Spring Boot只是承載者,輔助你簡化項目搭建過程的。如果承載的是WEB項目,使用Spring MVC作為MVC框架,那么工作流程和你上面描述的是完全一樣的,因為這部分工作是Spring MVC做的而不是Spring Boot。
對使用者來說,換用Spring Boot以后,項目初始化方法變了,配置文件變了,另外就是不需要單獨安裝Tomcat這類容器服務器了,maven打出jar包直接跑起來就是個網站,但你最核心的業務邏輯實現與業務流程實現沒有任何變化。
?
總結:Spring?最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應用組件。大家覺得挺好用,于是按照這種模式搞了一個?MVC框架(一些用Spring?解耦的組件),用開發?web?應用(?SpringMVC?)。然后發現每次開發都寫很多樣板代碼,為了簡化工作流程,于是開發出了一些“懶人整合包”(starter),這套就是?Spring Boot。
?
所以,用最簡練的語言概括就是:
Spring?是一個“引擎”;
Spring MVC?是基于Spring的一個?MVC?框架;
Spring Boot?是基于Spring4的條件注冊的一套快速開發整合包。
?
spring boot就是一個大框架里面包含了許許多多的東西,其中spring就是最核心的內容之一,當然就包含spring mvc。
spring mvc 是只是spring 處理web層請求的一個模塊。
?
因此他們的關系大概就是這樣:
spring mvc < spring <springboot。
?
spring boot 我理解就是把 spring? spring mvc? spring data? jpa 等等的一些常用的常用的基礎框架組合起來,提供默認的配置,然后提供可插拔的設計,就是各種 starter ,來方便開發者使用這一系列的技術,套用官方的一句話, spring 家族發展到今天,已經很龐大了,作為一個開發者,如果想要使用 spring 家族一系列的技術,需要一個一個的搞配置,然后還有個版本兼容性問題,其實挺麻煩的,偶爾也會有小坑出現,其實蠻影響開發進度, spring boot 就是來解決這個問題,提供了一個解決方案吧,可以先不關心如何配置,可以快速的啟動開發,進行業務邏輯編寫,各種需要的技術,加入 starter 就配置好了,直接使用,可以說追求開箱即用的效果吧.
?
spring 框架有超多的延伸產品例如 boot security jpa etc... 但它的基礎就是 spring 的 ioc 和 aop ioc 提供了依賴注入的容器 aop 解決了面向橫切面的編程 然后在此兩者的基礎上實現了其他延伸產品的高級功能 Spring MVC 呢是基于 Servlet 的一個 MVC 框架 主要解決 WEB 開發的問題 因為 Spring 的配置太復雜了 各種 XML JavaConfig hin 麻煩 于是懶人改變世界推出了 Spring boot 約定優于配置 簡化了 spring 的配置流程.
?
Spring 最初利用“工廠模式”( DI )和“代理模式”( AOP )解耦應用組件。大家覺得挺好用,于是按照這種模式搞了一個 MVC 框架(一些用 Spring 解耦的組件),用開發 web 應用( SpringMVC )。然后有發現每次開發都要搞很多依賴,寫很多樣板代碼很麻煩,于是搞了一些懶人整合包( starter ),這套就是 Spring Boot 。
?
springboot中默認了springmvc的配置,因此我們無須手動編寫springmvc的xml文件。
但是我們依然可以同時自定義的配置。以下有兩種方式,分別是在配置文件application.properties中實現,還有一種是編寫配置類來覆蓋springboot里面的默認配置。
這一篇開始講解如何使用springboot進行實際的應用開發,基本上尋著spring應用的路子來講,從springmvc以及web開發講起。
官方文檔中在helloworld和springmvc之間還有一部分內容,主要講了spring應用的啟動、通用配置以及日志配置相關的內容,其中關于通用配置的部分對于springboot來說是個很重要的內容,這部分等到后面在細說下,有了一定的應用能力,到時候理解起來輕松些。
先來回顧下springmvc是怎么使用的。
首先需要配置DispatcherServlet,一般是在web.xml中配置
這一點在springboot中就不需要手動寫xml配置了,springboot的autoconfigure會默認配置成上面那樣,servlet-name并不是一個特別需要注意的屬性,因此可以不用太關心這個屬性是否一致。
具體的初始化是在 org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration中完成的,對應的一些配置在 org.springframework.boot.autoconfigure.web.ServerProperties 以及
org.springframework.boot.autoconfigure.web.WebMvcProperties,后面講一些常用的配置,不常用的就自己看源碼了解吧,就不細說了。
然后是ViewResolver,也就是視圖處理的配置。在springmvc中,一般是在springmvc的xml配置中添加下列內容
<!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/> </bean>低版本的spring需要加上viewClass,高版本的spring會自動檢測是否使用JstlView,因此這個屬性通常并不需要手動配置,主要關心prefix和suffix。另外高版本的springmvc也不需要手動指定 HandlerMapping 以及
HandlerAdapter ,這兩個也不需要顯式聲明bean。
如何在springboot中配置ViewResolver,主要有兩種方法。
一種是在application.properties中配置,這是springboot中標準的配置方法。
另外一種是springmvc中的代碼式配置,這種也是現在比較流行的配置方式,不顯式指定配置文件,配置即代碼的思想,腳本語言python js scala流行的配置方式。
代碼是配置的主要操作就是自己寫代碼來為mvc配置類中的某個方法注入bean或者直接覆蓋方法,如下:
上面的視圖使用的是jsp,這時需要在pom.xml中添加新的依賴。
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><scope>provided</scope> </dependency>代碼也相應的改寫下,返回視圖時,不能使用@ResponseBody,也就是不能使用@RestController
package pr.study.springboot.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView;//@RestController @Controller public class HelloWorldController {@RequestMapping("/hello")public ModelAndView hello() {ModelAndView mv = new ModelAndView();mv.addObject("msg", "this a msg from HelloWorldController");mv.setViewName("helloworld");;return mv;} }還要新建jsp文件,路徑和使用普通的tomcat部署一樣,要在src/main/webapp目錄下新建jsp的文件夾,這里路徑不能寫錯。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>helloworld</title> </head> <body><p>${msg}</p> </body> </html>springboot使用嵌入式Servlet容器,對jsp支持有限,官方是推薦使用模板引擎來代替jsp。
第三點講下比較重要的springmvc攔截器(HandlerInterceptor)。
攔截器在springmvc中有重要的作用,它比servlet的Filter功能更強大(攔截器中可以編程的地方更多)也更好使用,缺點就是它只能針對springmvc,也就是dispatcherServlet攔截的請求,不是所有servlet都能被它攔截。
springmvc中添加攔截器配置如下:
Interceptor1攔截所有請求,也就是/**,Interceptor2只攔截/users開頭的請求。
在springboot中并沒有提供配置文件的方式來配置攔截器(HandlerInterceptor),因此需要使用springmvc的代碼式配置,配置如下:
第四點講下靜態資源映射。
一些簡單的web應用中都是動靜混合的,包含許多靜態內容,這些靜態內容并不需要由dispatcherServlet進行轉發處理,不需要進行攔截器等等的處理,只需要直接返回內容就行。springmvc提供了靜態資源映射這個功能,在xml中配置如下:
springboot中有兩種配置,一種是通過配置文件application.properties指定
# default is: /, "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" #spring.resources.static-locations=classpath:/res/ # the 'staticLocations' is equal to 'static-locations' #spring.resources.staticLocations=classpath:/res/# default is /** #spring.mvc.staticPathPattern=/**另外一種是springmvc的代碼式配置
@Configuration public class SpringMvcConfigure extends WebMvcConfigurerAdapter {@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/jsp/");viewResolver.setSuffix(".jsp");// viewResolver.setViewClass(JstlView.class); // 這個屬性通常并不需要手動配置,高版本的Spring會自動檢測return viewResolver;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new Interceptor1()).addPathPatterns("/**");registry.addInterceptor(new Interceptor2()).addPathPatterns("/users").addPathPatterns("/users/**");super.addInterceptors(registry);}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// addResourceHandler指的是訪問路徑,addResourceLocations指的是文件放置的目錄 registry.addResourceHandler("/**").addResourceLocations("classpath:/res/");} }兩種方式效果一樣,配置后訪問正確的靜態文件都不會被攔截器攔截。
當然,靜態文件不被攔截的方法還有很多,比如使用其他的servlet來轉發靜態文件,攔截器(HandlerInterceptor)的exclude,dispatcherServlet攔截/*.do等等方式,這里就不細說了。
今天就到此為止,springmvc以及Web的還有不少內容,下期在說
因為Demo比較簡單,這里就沒有貼運行結果的圖,相關代碼如下:
https://gitee.com/page12/stud...
https://github.com/page12/stu...
一些有既可以通過application.properties配置,又可以使用代碼式配置的,都注釋掉了application.properties中的配置,試運行時可以切換下。
-
- 舉報
總結
以上是生活随笔為你收集整理的框架:spring、springmvc、springboot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String为什么是不可变类型?
- 下一篇: s3c2440移植MQTT