你見過哪些操蛋的代碼膀曾?切勿模仿县爬!

來自:uee.me/cNDC8

概述

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

什么是Spring

作為 Java開發(fā)人員,大家都 Spring都不陌生污筷,簡而言之工闺, Spring框架為開發(fā) Java應用程序提供了全面的基礎架構支持。

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

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

什么是Spring Boot

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

SpringBoot中的一些特征:

1、創(chuàng)建獨立的 Spring應用记罚。2墅诡、嵌入式 Tomcat、 Jetty桐智、 Undertow容器(無需部署war文件)末早。3、提供的 starters 簡化構建配置4酵使、盡可能自動配置 spring應用荐吉。5、提供生產(chǎn)指標,例如指標口渔、健壯檢查和外部化配置6、完全沒有代碼生成和 XML配置要求

從配置分析

Maven依賴

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

<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-jpaspring-boot-starter-securityspring-boot-starter-testspring-boot-starter-webspring-boot-starter-thymeleaf

有關 starter的完整列表僚焦,請查看Spring文檔。

MVC配置

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

Spring需要定義調(diào)度程序 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肮韧,并根據(jù)這些依賴項,對屬性和 bean進行配置。當然惹苗,如果我們想要添加自己的自定義配置殿较,那么 SpringBoot自動配置將會退回。

配置模板引擎

現(xiàn)在我們來看下如何在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 添加為 SpringBoot2XWeb應用程序中的依賴項洽瞬。配置好依賴,我們就可以將模板添加到 src/main/resources/templates文件夾中业汰, SpringBoot將自動顯示它們伙窃。

Spring Security 配置

為簡單起見,我們使用框架默認的 HTTPBasic身份驗證样漆。讓我們首先看一下使用 Spring啟用 Security所需的依賴關系和配置为障。

Spring首先需要依賴 spring-security-web和 spring-security-config 模塊。接下來放祟, 我們需要添加一個擴展 WebSecurityConfigurerAdapter的類鳍怨,并使用 @EnableWebSecurity注解:

@Configuration

@EnableWebSecurity

publicclassCustomWebSecurityConfigurerAdapterextendsWebSecurityConfigurerAdapter{

@Autowired

publicvoid configureGlobal(AuthenticationManagerBuilder auth) throwsException{

? ? ? ? auth.inMemoryAuthentication()

.withUser("admin")

.password(passwordEncoder()

.encode("password"))

.authorities("ROLE_ADMIN");

}

@Override

protectedvoid configure(HttpSecurity http) throwsException{

? ? ? ? http.authorizeRequests()

.anyRequest().authenticated()

.and()

.httpBasic();

}

@Bean

publicPasswordEncoder passwordEncoder() {

returnnewBCryptPasswordEncoder();

}

}

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

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

應用程序啟動引導配置

Spring和 SpringBoot中應用程序引導的基本區(qū)別在于 servlet。Spring使用 web.xml 或 SpringServletContainerInitializer作為其引導入口點纽疟。SpringBoot僅使用 Servlet3功能來引導應用程序罐韩,下面讓我們詳細來了解下

Spring 引導配置

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

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

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

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

DispatcherServlet通過讀取 WEB-INF/{servletName}-servlet.xml來創(chuàng)建 WebApplicationContext仰挣。最后伴逸, DispatcherServlet注冊在應用程序上下文中定義的 bean

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

容器搜索實現(xiàn) ServletContainerInitializer的類并執(zhí)行 SpringServletContainerInitializer找到實現(xiàn)所有類 WebApplicationInitializer``WebApplicationInitializer創(chuàng)建具有XML或上下文 @Configuration類 WebApplicationInitializer創(chuàng)建 DispatcherServlet與先前創(chuàng)建的上下文。

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{

@Override

protectedSpringApplicationBuilder configure(SpringApplicationBuilder application) {

return application.sources(Application.class);

}

@Override

publicvoid 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支持。它還允許打包可執(zhí)行 jar或 war包并 就地運行應用程序其屏。

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

1喇勋、提供嵌入式容器支持2、使用命令java -jar獨立運行jar3偎行、在外部容器中部署時川背,可以選擇排除依賴關系以避免潛在的jar沖突4、部署時靈活指定配置文件的選項5蛤袒、用于集成測試的隨機端口生成

結論

簡而言之渗常,我們可以說 SpringBoot只是 Spring本身的擴展,使開發(fā)汗盘,測試和部署更加方便。

<END>

本文發(fā)于 微星公眾號「程序員的成長之路」询一,回復「1024」你懂得隐孽,給個贊唄。

回復 [ 256 ] Java 程序員成長規(guī)劃

回復 [ 777 ] 接私活的七大平臺利器

回復 [ 2048 ] 免費領取C/C++健蕊,Linux菱阵,Python,Java缩功,PHP晴及,人工智能,單片機嫡锌,樹莓派虑稼,等 5T 學習資料

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市势木,隨后出現(xiàn)的幾起案子蛛倦,更是在濱河造成了極大的恐慌,老刑警劉巖啦桌,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯壶,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機且改,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門验烧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人又跛,你說我怎么就攤上這事碍拆。” “怎么了效扫?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵倔监,是天一觀的道長。 經(jīng)常有香客問我菌仁,道長浩习,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任济丘,我火速辦了婚禮谱秽,結果婚禮上,老公的妹妹穿的比我還像新娘摹迷。我一直安慰自己疟赊,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布峡碉。 她就那樣靜靜地躺著近哟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲫寄。 梳的紋絲不亂的頭發(fā)上吉执,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音地来,去河邊找鬼戳玫。 笑死,一個胖子當著我的面吹牛未斑,可吹牛的內(nèi)容都是我干的咕宿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蜡秽,長吁一口氣:“原來是場噩夢啊……” “哼府阀!你這毒婦竟也來了?” 一聲冷哼從身側響起载城,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肌似,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诉瓦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體川队,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡力细,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了固额。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眠蚂。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖斗躏,靈堂內(nèi)的尸體忽然破棺而出逝慧,到底是詐尸還是另有隱情,我是刑警寧澤啄糙,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布笛臣,位于F島的核電站,受9級特大地震影響隧饼,放射性物質(zhì)發(fā)生泄漏沈堡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一燕雁、第九天 我趴在偏房一處隱蔽的房頂上張望诞丽。 院中可真熱鬧,春花似錦拐格、人聲如沸僧免。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懂衩。三九已至,卻和暖如春金踪,著一層夾襖步出監(jiān)牢的瞬間勃痴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工热康, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劣领。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓姐军,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尖淘。 傳聞我的和親對象是個殘疾皇子奕锌,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359