<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試題:說一下Spring 和 Spring Boot 的區(qū)別

          共 7465字,需瀏覽 15分鐘

           ·

          2020-08-06 12:11

          點擊上方[全棧開發(fā)者社區(qū)]右上角[...][設(shè)為星標(biāo)?]

          前言


          對于 Spring和 SpringBoot到底有什么區(qū)別,我聽到了很多答案,剛開始邁入學(xué)習(xí) SpringBoot的我當(dāng)時也是一頭霧水,隨著經(jīng)驗的積累、我慢慢理解了這兩個框架到底有什么區(qū)別,相信對于用了 SpringBoot很久的同學(xué)來說,還不是很理解 SpringBoot到底和 Spring有什么區(qū)別,看完文章中的比較,或許你有了不同的答案和看法!


          什么是Spring


          作為 Java開發(fā)人員,大家都 Spring都不陌生,簡而言之, Spring框架為開發(fā) Java應(yīng)用程序提供了全面的基礎(chǔ)架構(gòu)支持。


          它包含一些很好的功能,如依賴注入和開箱即用的模塊,如:SpringJDBC、SpringMVC、SpringSecurity、SpringAOP、SpringORM、SpringTest,這些模塊縮短應(yīng)用程序的開發(fā)時間,提高了應(yīng)用開發(fā)的效率例如,在 JavaWeb開發(fā)的早期階段,我們需要編寫大量的代碼來將記錄插入到數(shù)據(jù)庫中。


          但是通過使用 SpringJDBC模塊的 JDBCTemplate,我們可以將操作簡化為幾行代碼。


          什么是Spring Boot


          SpringBoot基本上是 Spring框架的擴(kuò)展,它消除了設(shè)置 Spring應(yīng)用程序所需的 XML配置,為更快,更高效的開發(fā)生態(tài)系統(tǒng)鋪平了道路。


          SpringBoot中的一些特征:


          1、創(chuàng)建獨立的 Spring應(yīng)用。

          2、嵌入式 Tomcat、 Jetty、 Undertow容器(無需部署war文件)。3、提供的 starters 簡化構(gòu)建配置?

          4、盡可能自動配置 spring應(yīng)用。

          5、提供生產(chǎn)指標(biāo),例如指標(biāo)、健壯檢查和外部化配置

          ?6、完全沒有代碼生成和 XML配置要求


          從配置分析


          Maven依賴


          首先,讓我們看一下使用Spring創(chuàng)建Web應(yīng)用程序所需的最小依賴項


          <dependency>
          ????<groupId>org.springframeworkgroupId>
          ????<artifactId>spring-webartifactId>
          ????<version>5.1.0.RELEASEversion>
          dependency>
          <dependency>
          ????<groupId>org.springframeworkgroupId>
          ????<artifactId>spring-webmvcartifactId>
          ????<version>5.1.0.RELEASEversion>
          dependency>


          與Spring不同,Spring Boot只需要一個依賴項來啟動和運行Web應(yīng)用程序:


          <dependency>
          ????<groupId>org.springframework.bootgroupId>
          ????<artifactId>?spring-boot-starter-webartifactId>
          ????<version>2.0.6.RELEASEversion>
          dependency>


          在進(jìn)行構(gòu)建期間,所有其他依賴項將自動添加到項目中。


          另一個很好的例子就是測試庫。我們通常使用 SpringTest, JUnit, Hamcrest和 Mockito庫。在 Spring項目中,我們應(yīng)該將所有這些庫添加為依賴項。但是在 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


          有關(guān) starter的完整列表,請查看Spring文檔。


          MVC配置


          讓我們來看一下 Spring和 SpringBoot創(chuàng)建 JSPWeb應(yīng)用程序所需的配置。


          Spring需要定義調(diào)度程序 servlet,映射和其他支持配置。我們可以使用 web.xml 文件或 Initializer類來完成此操作:


          public?class?MyWebAppInitializer?implements?WebApplicationInitializer?{
          ????@Override
          ????public?void?onStartup(ServletContext?container)?{
          ????????AnnotationConfigWebApplicationContext?context?=?new?AnnotationConfigWebApplicationContext();
          ????????context.setConfigLocation("com.pingfangushi");
          ????????container.addListener(new?ContextLoaderListener(context));
          ????????ServletRegistration.Dynamic?dispatcher?=?container.addServlet(
          ????????????????"dispatcher",?new?DispatcherServlet(context));
          ????????dispatcher.setLoadOnStartup(1);
          ????????dispatcher.addMapping("/");
          ????}
          }


          還需要將 @EnableWebMvc注釋添加到 @Configuration類,并定義一個視圖解析器來解析從控制器返回的視圖:


          @EnableWebMvc
          @Configuration
          public?class?ClientWebConfig?implements?WebMvcConfigurer?{
          ????@Bean
          ????public?ViewResolver?viewResolver()?{
          ????????InternalResourceViewResolver?bean?=?new?InternalResourceViewResolver();
          ????????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將查看應(yīng)用程序中存在的依賴項,屬性和 bean,并根據(jù)這些依賴項,對屬性和 bean進(jìn)行配置。


          當(dāng)然,如果我們想要添加自己的自定義配置,那么 SpringBoot自動配置將會退回。


          配置模板引擎


          現(xiàn)在我們來看下如何在Spring和Spring Boot中配置Thymeleaf模板引擎。


          在 Spring中,我們需要為視圖解析器添加 thymeleaf-spring5依賴項和一些配置:


          @Configuration
          @EnableWebMvc
          public?class?MvcWebConfig?implements?WebMvcConfigurer?{
          ????@Autowired
          ????private?ApplicationContext?applicationContext;

          ????@Bean
          ????public?SpringResourceTemplateResolver?templateResolver()?{
          ????????SpringResourceTemplateResolver?templateResolver?=?new?SpringResourceTemplateResolver();
          ????????templateResolver.setApplicationContext(applicationContext);
          ????????templateResolver.setPrefix("/WEB-INF/views/");
          ????????templateResolver.setSuffix(".html");
          ????????return?templateResolver;
          ????}

          ????@Bean
          ????public?SpringTemplateEngine?templateEngine()?{
          ????????SpringTemplateEngine?templateEngine?=?new?SpringTemplateEngine();
          ????????templateEngine.setTemplateResolver(templateResolver());
          ????????templateEngine.setEnableSpringELCompiler(true);
          ????????return?templateEngine;
          ????}

          ????@Override
          ????public?void?configureViewResolvers(ViewResolverRegistry?registry)?{
          ????????ThymeleafViewResolver?resolver?=?new?ThymeleafViewResolver();
          ????????resolver.setTemplateEngine(templateEngine());
          ????????registry.viewResolver(resolver);
          ????}
          }


          SpringBoot1X只需要 spring-boot-starter-thymeleaf的依賴項來啟用 Web應(yīng)用程序中的 Thymeleaf支持。??


          但是由于 Thymeleaf3.0中的新功能,我們必須將 thymeleaf-layout-dialect 添加為 SpringBoot2XWeb應(yīng)用程序中的依賴項。配置好依賴,我們就可以將模板添加到 src/main/resources/templates文件夾中, SpringBoot將自動顯示它們。


          Spring Security 配置


          為簡單起見,我們使用框架默認(rèn)的 HTTPBasic身份驗證。讓我們首先看一下使用 Spring啟用 Security所需的依賴關(guān)系和配置。


          @Configuration
          @EnableWebSecurity
          public?class?CustomWebSecurityConfigurerAdapter?extends
          ????????WebSecurityConfigurerAdapter?
          {
          ????@Autowired
          ????public?void?configureGlobal(AuthenticationManagerBuilder?auth)
          ????????????throws?Exception?
          {
          ????????auth.inMemoryAuthentication().withUser("admin")
          ????????????????.password(passwordEncoder().encode("password"))
          ????????????????.authorities("ROLE_ADMIN");
          ????}

          ????@Override
          ????protected?void?configure(HttpSecurity?http)?throws?Exception?{
          ????????http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
          ????}

          ????@Bean
          ????public?PasswordEncoder?passwordEncoder()?{
          ????????return?new?BCryptPasswordEncoder();
          ????}
          }


          這里我們使用 inMemoryAuthentication來設(shè)置身份驗證。同樣, SpringBoot也需要這些依賴項才能使其工作。但是我們只需要定義 spring-boot-starter-security的依賴關(guān)系,因為這會自動將所有相關(guān)的依賴項添加到類路徑中。


          SpringBoot中的安全配置與上面的相同 。


          應(yīng)用程序啟動引導(dǎo)配置


          Spring和 SpringBoot中應(yīng)用程序引導(dǎo)的基本區(qū)別在于 servlet。


          Spring使用 web.xml 或 SpringServletContainerInitializer作為其引導(dǎo)入口點。SpringBoot僅使用 Servlet3功能來引導(dǎo)應(yīng)用程序,下面讓我們詳細(xì)來了解下

          Spring 引導(dǎo)配置 Spring支持傳統(tǒng)的 web.xml引導(dǎo)方式以及最新的 Servlet3+方法。


          配置 web.xml方法啟動的步驟


          Servlet容器(服務(wù)器)讀取 web.xml


          web.xml中定義的 DispatcherServlet由容器實例化


          DispatcherServlet通過讀取 WEB-INF/{servletName}-servlet.xml來創(chuàng)建 WebApplicationContext。


          最后, DispatcherServlet注冊在應(yīng)用程序上下文中定義的 bean


          使用 Servlet3+方法的 Spring啟動步驟


          容器搜索實現(xiàn) ServletContainerInitializer的類并執(zhí)行?

          SpringServletContainerInitializer找到實現(xiàn)所有類 WebApplicationInitializerWebApplicationInitializer創(chuàng)建具有XML或上下文 @Configuration類 WebApplicationInitializer創(chuàng)建 DispatcherServlet與先前創(chuàng)建的上下文。


          SpringBoot 引導(dǎo)配置


          Spring Boot應(yīng)用程序的入口點是使用@SpringBootApplication注釋的類


          @SpringBootApplication
          public?class?Application?{
          ????public?static?void?main(String[]?args)?{
          ????????SpringApplication.run(Application.class,?args);
          ????}
          }


          默認(rèn)情況下, SpringBoot使用嵌入式容器來運行應(yīng)用程序。在這種情況下, SpringBoot使用 publicstaticvoidmain入口點來啟動嵌入式 Web服務(wù)器。


          此外,它還負(fù)責(zé)將 Servlet, Filter和 ServletContextInitializerbean從應(yīng)用程序上下文綁定到嵌入式 servlet容器。


          SpringBoot的另一個特性是它會自動掃描同一個包中的所有類或 Main類的子包中的組件。


          SpringBoot提供了將其部署到外部容器的方式。我們只需要擴(kuò)展 SpringBootServletInitializer即可:


          /**
          ?*?War部署
          ?*/

          public?class?ServletInitializer?extends?SpringBootServletInitializer?{
          ????@Override
          ????protected?SpringApplicationBuilder?configure(
          ????????????SpringApplicationBuilder?application)
          ?
          {
          ????????return?application.sources(Application.class);
          ????}

          ????@Override
          ????public?void?onStartup(ServletContext?servletContext)
          ????????????throws?ServletException?
          {
          ????????super.onStartup(servletContext);
          ????????servletContext.addListener(new?HttpSessionEventPublisher());
          ????}
          }


          這里外部 servlet容器查找在war包下的 META-INF文件夾下MANIFEST.MF文件中定義的 Main-class, SpringBootServletInitializer將負(fù)責(zé)綁定 Servlet, Filter和 ServletContextInitializer。


          打包和部署


          最后,讓我們看看如何打包和部署應(yīng)用程序。這兩個框架都支持 Maven和 Gradle等通用包管理技術(shù)。但是在部署方面,這些框架差異很大。


          例如,Spring Boot Maven插件在 Maven中提供 SpringBoot支持。它還允許打包可執(zhí)行 jar或 war包并 就地運行應(yīng)用程序。


          在部署環(huán)境中 SpringBoot 對比 Spring的一些優(yōu)點包括:


          1、提供嵌入式容器支持?

          2、使用命令_java -jar_獨立運行jar?

          3、在外部容器中部署時,可以選擇排除依賴關(guān)系以避免潛在的jar沖突 4、部署時靈活指定配置文件的選項?

          5、用于集成測試的隨機(jī)端口生成


          結(jié)論


          簡而言之,我們可以說 SpringBoot只是 Spring本身的擴(kuò)展,這次的文章就到這里了,看完希望你們都能有收獲!


          覺得本文對你有幫助?請分享給更多人

          關(guān)注「全棧開發(fā)者社區(qū)」加星標(biāo),提升全棧技能


          本公眾號會不定期給大家發(fā)福利,包括送書、學(xué)習(xí)資源等,敬請期待吧!

          如果感覺推送內(nèi)容不錯,不妨右下角點個在看轉(zhuǎn)發(fā)朋友圈或收藏,感謝支持。


          好文章,留言、點贊、在看和分享一條龍吧??

          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  激情五月丁香小说 | 天天色一色 | 国精品无码一区二区三区在线 | 亚人精品中文字幕在线观看 | 国产视频大全 |