Spring 和 SpringBoot 之間到底有啥區別?

概述

對於 Spring SpringBoot 到底有什麼區別,我聽到了不少答案,剛開始邁入學習 SpringBoot 的我當時也是一頭霧水,隨着經驗的積累、我慢慢理解了這兩個框架到底有什麼區別,相信對於用了 SpringBoot 好久的同窗來講,還不是很理解 SpringBoot 到底和 Spring 有什麼區別,看完文章中的比較,或許你有了不一樣的答案和見解!

什麼是Spring

做爲 Java 開發人員,你們都 Spring 都不陌生,簡而言之, Spring 框架爲開發 Java 應用程序提供了全面的基礎架構支持。它包含一些很好的功能,如依賴注入和開箱即用的模塊,如: SpringJDBC、SpringMVC、SpringSecurity、SpringAOP、SpringORM、SpringTest ,這些模塊縮短應用程序的開發時間,提升了應用開發的效率例如,在 JavaWeb 開發的早期階段,咱們須要編寫大量的代碼來將記錄插入到數據庫中。可是經過使用 SpringJDBC 模塊的 JDBCTemplate ,咱們能夠將操做簡化爲幾行代碼

什麼是Spring Boot

SpringBoot 基本上是 Spring 框架的擴展,它消除了設置 Spring 應用程序所需的 XML配置 ,爲更快,更高效的開發生態系統鋪平了道路。
SpringBoot中的一些特徵:
一、建立獨立的 Spring 應用。
二、嵌入式
Tomcat Jetty Undertow 容器(無需部署war文件)。
三、提供的
starters 簡化構建配置
四、儘量自動配置
spring 應用。
五、提供生產指標,例如指標、健壯檢查和外部化配置
六、徹底沒有代碼生成和
XML 配置要求

從配置分析

Maven依賴

首先,讓咱們看一下使用Spring建立Web應用程序所需的最小依賴項
  
  
  
   
   
            
   
   
  1. html

  2. java

  3. web

  4. spring

  5. 數據庫

  6. 安全

  7. 服務器

  8. 微信

  9. 架構

  10. mvc

<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.0.RELEASE</version></dependency>
與Spring不一樣,Spring Boot只須要一個依賴項來啓動和運行Web應用程序:
  
  
  
   
   
            
   
   
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.0.6.RELEASE</version></dependency>
在進行構建期間,全部其餘依賴項將自動添加到項目中。
另外一個很好的例子就是測試庫。咱們一般使用 SpringTest JUnit Hamcrest Mockito 庫。在 Spring 項目中,咱們應該將全部這些庫添加爲依賴項。可是在 SpringBoot中 ,咱們只須要添加 spring-boot-starter-test 依賴項來自動包含這些庫。
Spring Boot爲不一樣的Spring模塊提供了許多依賴項。一些最經常使用的是:
spring-boot-starter-data-jpa spring-boot-starter-security spring-boot-starter-test spring-boot-starter-web spring-boot-starter-thymeleaf
有關 starter 的完整列表,請查看Spring文檔。

MVC配置

讓咱們來看一下 SpringSpringBoot建立 JSPWeb應用程序所需的配置。
Spring 須要定義調度程序 servlet ,映射和其餘支持配置。咱們可使用 web.xml 文件或 Initializer 類來完成此操做:
  
  
  
   
   
            
   
   

publicclassMyWebAppInitializerimplementsWebApplicationInitializer{@Overridepublicvoid onStartup(ServletContext container) {AnnotationConfigWebApplicationContext context = newAnnotationConfigWebApplicationContext(); context.setConfigLocation("com.pingfangushi"); container.addListener(newContextLoaderListener(context));ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", newDispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/");}}
還須要將 @EnableWebMvc 註釋添加到 @Configuration 類,並定義一個視圖解析器來解析從控制器返回的視圖:
  
  
  
   
   
            
   
   
@EnableWebMvc@ConfigurationpublicclassClientWebConfigimplementsWebMvcConfigurer{@BeanpublicViewResolver viewResolver() {InternalResourceViewResolver bean= newInternalResourceViewResolver(); bean.setViewClass(JstlView.class); bean.setPrefix("/WEB-INF/view/"); bean.setSuffix(".jsp");return bean;}}
再來看 SpringBoot 一旦咱們添加了 Web 啓動程序, SpringBoot 只須要在 application 配置文件中配置幾個屬性來完成如上操做:
  
  
  
   
   
            
   
   
spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.suffix=.jsp
上面的全部Spring配置都是經過一個名爲auto-configuration的過程添加 Bootweb starter來自動包含的。
這意味着 SpringBoot 將查看應用程序中存在的依賴項,屬性和 bean ,並根據這些依賴項,對屬性和 bean 進行配置。固然,若是咱們想要添加本身的自定義配置,那麼 SpringBoot 自動配置將會退回

配置模板引擎

如今咱們來看下如何在Spring和Spring Boot中配置Thymeleaf模板引擎。
Spring 中,咱們須要爲視圖解析器添加 thymeleaf-spring5 依賴項和一些配置:
  
  
  
   
   
            
   
   




@Configuration@EnableWebMvcpublicclassMvcWebConfigimplementsWebMvcConfigurer{@AutowiredprivateApplicationContext applicationContext;@BeanpublicSpringResourceTemplateResolver templateResolver() {SpringResourceTemplateResolver templateResolver = newSpringResourceTemplateResolver(); templateResolver.setApplicationContext(applicationContext); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html");return templateResolver;}@BeanpublicSpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = newSpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.setEnableSpringELCompiler(true);return templateEngine;}@Overridepublicvoid configureViewResolvers(ViewResolverRegistry registry) {ThymeleafViewResolver resolver = newThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); registry.viewResolver(resolver);}}
SpringBoot1X 只須要 spring-boot-starter-thymeleaf 的依賴項來啓用 Web 應用程序中的 Thymeleaf 支持。  可是因爲 Thymeleaf3.0 中的新功能,咱們必須將 thymeleaf-layout-dialect 添加爲 SpringBoot2X Web應用程序中的依賴項。配置好依賴,咱們就能夠將模板添加到 src/main/resources/templates 文件夾中, SpringBoot 將自動顯示它們。

Spring Security 配置

爲簡單起見,咱們使用框架默認的 HTTPBasic 身份驗證。讓咱們首先看一下使用 Spring 啓用 Security 所需的依賴關係和配置。
Spring 首先須要依賴 spring-security-web spring-security-config 模塊。接下來, 咱們須要添加一個擴展 WebSecurityConfigurerAdapter 的類,並使用 @EnableWebSecurity 註解:
  
  
  
   
   
            
   
   



@Configuration@EnableWebSecuritypublicclassCustomWebSecurityConfigurerAdapterextendsWebSecurityConfigurerAdapter{@Autowiredpublicvoid configureGlobal(AuthenticationManagerBuilder auth) throwsException{ auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("password")).authorities("ROLE_ADMIN");}@Overrideprotectedvoid configure(HttpSecurity http) throwsException{ http.authorizeRequests().anyRequest().authenticated().and().httpBasic();}@BeanpublicPasswordEncoder passwordEncoder() {returnnewBCryptPasswordEncoder();}}
這裏咱們使用 inMemoryAuthentication 來設置身份驗證。一樣, SpringBoot 也須要這些依賴項才能使其工做。可是咱們只須要定義 spring-boot-starter-security 的依賴關係,由於這會自動將全部相關的依賴項添加到類路徑中
SpringBoot中的安全配置與上面的相同

應用程序啓動引導配置

Spring SpringBoot 中應用程序引導的基本區別在於 servlet Spring 使用 web.xml SpringServletContainerInitializer 做爲其引導入口點。 SpringBoot 僅使用 Servlet3 功能來引導應用程序,下面讓咱們詳細來了解下

Spring 引導配置

Spring 支持傳統的 web.xml 引導方式以及最新的 Servlet3+ 方法。
配置 web.xml方法啓動的步驟
Servlet 容器(服務器)讀取 web.xml
web.xml 中定義的 DispatcherServlet 由容器實例化
DispatcherServlet 經過讀取 WEB-INF/{servletName}-servlet.xml 來建立 WebApplicationContext 。最後, DispatcherServlet 註冊在應用程序上下文中定義的 bean
使用 Servlet3+方法的 Spring啓動步驟
容器搜索實現 ServletContainerInitializer 的類並執行 SpringServletContainerInitializer 找到實現全部類 WebApplicationInitializer``WebApplicationInitializer 建立具備XML或上下文 @Configuration WebApplicationInitializer 建立 DispatcherServlet 與先前建立的上下文。

SpringBoot 引導配置

Spring Boot應用程序的入口點是使用@SpringBootApplication註釋的類
  
  
  
   
   
            
   
   
@SpringBootApplicationpublicclassApplication{publicstaticvoid main(String[] args) {SpringApplication.run(Application.class, args);}}
默認狀況下, SpringBoot 使用嵌入式容器來運行應用程序。在這種狀況下, SpringBoot 使用 publicstaticvoidmain 入口點來啓動嵌入式 Web 服務器。此外,它還負責將 Servlet Filter ServletContextInitializerbean 從應用程序上下文綁定到嵌入式 servlet 容器。 SpringBoot 的另外一個特性是它會自動掃描同一個包中的全部類或 Main 類的子包中的組件
SpringBoot 提供了將其部署到外部容器的方式。咱們只須要擴展 SpringBootServletInitializer 便可:
  
  
  
   
   
            
   
   


/** * War部署 * * @author SanLi * Created by 2689170096@qq.com on 2018/4/15 */publicclassServletInitializerextendsSpringBootServletInitializer{@OverrideprotectedSpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(Application.class);}@Overridepublicvoid onStartup(ServletContext servletContext) throwsServletException{super.onStartup(servletContext); servletContext.addListener(newHttpSessionEventPublisher());}}
這裏外部 servlet 容器查找在war包下的 META-INF 文件夾下MANIFEST.MF文件中定義的 Main-class SpringBootServletInitializer 將負責綁定 Servlet Filter ServletContextInitializer

打包和部署

最後,讓咱們看看如何打包和部署應用程序。這兩個框架都支持 Maven Gradle 等通用包管理技術。可是在部署方面,這些框架差別很大。例如,Spring Boot Maven插件在 Maven 中提供 SpringBoot 支持。它還容許打包可執行 jar war 包並 就地 運行應用程序。
在部署環境中 SpringBoot 對比 Spring 的一些優勢包括:
一、提供嵌入式容器支持
二、使用命令java -jar獨立運行jar
三、在外部容器中部署時,能夠選擇排除依賴關係以免潛在的jar衝突
四、部署時靈活指定配置文件的選項
五、用於集成測試的隨機端口生成

結論

簡而言之,咱們能夠說 SpringBoot 只是 Spring 自己的擴展,使開發,測試和部署更加方便。


本文分享自微信公衆號 - Java小白學心理(gh_9a909fa2fb55)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索