色欲av一区久久精品_久久综合色综合色88_无码在线观看不卡_色黄视频网站_亚洲国产精品久久久久秋霞66

Spring 常犯的十大錯(cuò)誤

時(shí)間:2023-05-17

1.錯(cuò)誤一:太過(guò)關(guān)注底層
我們正在處理這個(gè)常見錯(cuò)誤,是由于“非我所創(chuàng)”綜合癥在軟件開發(fā)范疇很是常見。病癥包括經(jīng)常重寫一些常見的代碼,很多開發(fā)人員都有這種病癥。
固然了解特定庫(kù)的內(nèi)部構(gòu)造及其完成,在很大水平上是好的并且很有必要的(也能夠是一個(gè)很好的學(xué)習(xí)過(guò)程),但作為軟件工程師,不時(shí)地處置相同的底層完成細(xì)節(jié)對(duì)個(gè)人的開發(fā)作涯是有害的。
像Spring這種籠統(tǒng)框架的存在是有緣由的,它將你從反復(fù)地手工勞作中解放出來(lái),并允許你專注于更高層次的細(xì)節(jié)——范疇對(duì)象和業(yè)務(wù)邏輯。
因而,承受籠統(tǒng)。下次面對(duì)特定問(wèn)題時(shí),首先停止快速搜索,肯定處理該問(wèn)題的庫(kù)能否已被集成到Spring中;如今,你可能找到一個(gè)適宜的現(xiàn)成處理計(jì)劃。
比方,一個(gè)很有用的庫(kù),在本文的其他局部,我將在示例中運(yùn)用ProjectLombok注解。Lombok被用作榜樣代碼生成器,希望懶散的開發(fā)人員在熟習(xí)這個(gè)庫(kù)時(shí)不會(huì)遇到問(wèn)題。舉個(gè)例子,看看運(yùn)用Lombok的“規(guī)范JavaBean”是什么樣子的:
如你所想,上述代碼被編譯為:
但是,請(qǐng)留意,假如你打算在IDE中運(yùn)用Lombok,很可能需求裝置一個(gè)插件,可在此處找到IntellijIDEA版本的插件。java
2.錯(cuò)誤二:內(nèi)部構(gòu)造“泄露”
公開你的內(nèi)部構(gòu)造,歷來(lái)都不是一個(gè)好主見,由于它在效勞設(shè)計(jì)中形成了不靈敏性,從而促進(jìn)了不好的編碼理論?!靶孤丁钡膬?nèi)部機(jī)制表現(xiàn)為使數(shù)據(jù)庫(kù)構(gòu)造能夠從某些API端點(diǎn)訪問(wèn)。例如,下面的POJO(“PlainOldJavaObject”)類表示數(shù)據(jù)庫(kù)中的一個(gè)表:
假定,存在一個(gè)端點(diǎn),他需求訪問(wèn)TopTalentEntity數(shù)據(jù)。返回TopTalentEntity實(shí)例可能很誘人,但更靈敏的處理計(jì)劃是創(chuàng)立一個(gè)新的類來(lái)表示API端點(diǎn)上的TopTalentEntity數(shù)據(jù)。
這樣,對(duì)數(shù)據(jù)庫(kù)后端停止更改將不需求在效勞層停止任何額外的更改。思索下,在TopTalentEntity中添加一個(gè)“password”字段來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)中用戶密碼的Hash值——假如沒(méi)有TopTalentData之類的銜接器,遺忘更改效勞前端,將會(huì)不測(cè)地暴露一些不用要的機(jī)密信息。
3.錯(cuò)誤三:缺乏關(guān)注點(diǎn)別離
隨著程序范圍的增長(zhǎng),逐步地,代碼組織成為一個(gè)越來(lái)越重要的問(wèn)題。挖苦的是,大多數(shù)好的軟件工程準(zhǔn)繩開端在范圍上解體——特別是在沒(méi)有太多思索程序體系構(gòu)造設(shè)計(jì)的狀況下。開發(fā)人員最常犯的一個(gè)錯(cuò)誤就是混雜代碼關(guān)注點(diǎn),這很容易做到!
通常,突破關(guān)注點(diǎn)別離的是將新功用簡(jiǎn)單地“倒”在現(xiàn)有類中。當(dāng)然,這是一個(gè)很好的短期處理計(jì)劃(關(guān)于初學(xué)者來(lái)說(shuō),它需求更少的輸入),但它也不可防止地會(huì)在未來(lái)成為一個(gè)問(wèn)題,無(wú)論是在測(cè)試期間、維護(hù)期間還是介于兩者之間。思索下下面的控制器,它將從數(shù)據(jù)庫(kù)返回TopTalentData。
起初,這段代碼似乎沒(méi)什么特別的問(wèn)題;它提供了一個(gè)從TopTalentEntity實(shí)例檢索出來(lái)的TopTalentData的List。
但是,認(rèn)真察看下,我們能夠看到TopTalentController實(shí)踐上在此做了些事情;也就是說(shuō),它將懇求映射到特定端點(diǎn),從數(shù)據(jù)庫(kù)檢索數(shù)據(jù),并將從TopTalentRepository接納的實(shí)體轉(zhuǎn)換為另一種格式。一個(gè)“更潔凈”的處理計(jì)劃是將這些關(guān)注點(diǎn)別離到他們本人的類中??雌饋?lái)可能是這個(gè)樣子的:
這種層次構(gòu)造的另一個(gè)優(yōu)點(diǎn)是,它允許我們經(jīng)過(guò)檢查類名來(lái)肯定將功用駐留在何處。此外,在測(cè)試期間,假如需求,我們能夠很容易地用模仿完成來(lái)交換任何類。
4.錯(cuò)誤四:缺乏異常處置或處置不當(dāng)
分歧性的主題并非是Spring(或Java)所獨(dú)有的,但依然是處置Spring項(xiàng)目時(shí)需求思索的一個(gè)重要方面。固然編碼作風(fēng)可能存在爭(zhēng)議(通常團(tuán)隊(duì)或整個(gè)公司內(nèi)部已達(dá)成分歧),但具有一個(gè)共同的規(guī)范最終會(huì)極大地進(jìn)步消費(fèi)力。對(duì)多人團(tuán)隊(duì)尤為如此;分歧性允許交流發(fā)作,而不需求破費(fèi)很多資源在手把手交接上,也不需求就不同類的職責(zé)提供冗長(zhǎng)的解釋。
思索一個(gè)包含各種配置文件、效勞和控制器的Spring項(xiàng)目。在命名時(shí)堅(jiān)持語(yǔ)義上的分歧性,能夠創(chuàng)立一個(gè)易于搜索的構(gòu)造,任何新的開發(fā)人員都能夠依照本人的方式管理代碼;例如,將Config后綴添加到配置類,效勞層以Service結(jié)尾,以及控制器用Controller結(jié)尾。
與分歧性主題親密相關(guān),效勞器端的錯(cuò)誤處置值得特別強(qiáng)調(diào)。假如你曾經(jīng)不得不處置編寫很差的API的異常響應(yīng),那你可能曉得緣由——正確解析異常會(huì)是一件痛苦的事情,而肯定這些異常最初發(fā)作的緣由則更為痛苦。
作為一名API開發(fā)者,理想狀況下你希望掩蓋一切面向用戶的端點(diǎn),并將他們轉(zhuǎn)換為常見的錯(cuò)誤格式。這通常意味著有一個(gè)通用的錯(cuò)誤代碼和描繪,而不是逃避處理問(wèn)題:a)返回一個(gè)“500InternalServerError”信息。b)直接返回異常的堆棧信息給用戶。(實(shí)踐上,這些都應(yīng)該不惜一切代價(jià)地去防止,由于除了客戶端難以處置以外,它還暴露了你的內(nèi)部信息)。
例如,常見錯(cuò)誤響應(yīng)格式可能長(zhǎng)這樣:
與此相似的事情在大多數(shù)盛行的API中也經(jīng)常遇到,由于能夠容易且系統(tǒng)地記載,效果常常很不錯(cuò)。將異常轉(zhuǎn)換為這種格式能夠經(jīng)過(guò)向辦法提供@ExceptionHandler注解來(lái)完成(注解案例可見于第六章)。
5.錯(cuò)誤五:多線程處置不當(dāng)
不論是桌面應(yīng)用還是Web應(yīng)用,無(wú)論是Spring還是NoSpring,多線程都是很難破解的。由并行執(zhí)行程序所惹起的問(wèn)題是令人毛骨悚然且難以捉摸的,而且常常難以調(diào)試——實(shí)踐上,由于問(wèn)題的實(shí)質(zhì),一旦你認(rèn)識(shí)到你正在處置一個(gè)并行執(zhí)行問(wèn)題,你可能就不得不完整放棄調(diào)試器了,并“手動(dòng)”檢查代碼,直到找到基本上的錯(cuò)誤緣由。
不幸的是,這類問(wèn)題并沒(méi)有千篇一概的處理計(jì)劃;依據(jù)詳細(xì)場(chǎng)景來(lái)評(píng)價(jià)狀況,然后從你以為最好的角度來(lái)處理問(wèn)題。
當(dāng)然,理想狀況下,你也希望完整防止多線程錯(cuò)誤。同樣,不存在那種一刀切的辦法,但這有一些調(diào)試和避免多線程錯(cuò)誤的實(shí)踐思索要素:
5.1.防止全局狀態(tài)
首先,牢記“全局狀態(tài)”問(wèn)題。假如你正創(chuàng)立一個(gè)多線程應(yīng)用,那么應(yīng)該親密關(guān)注任何可能全局修正的內(nèi)容,假如可能的話,將他們?nèi)縿h掉。假如某個(gè)全局變量有必需堅(jiān)持可修正的緣由,請(qǐng)認(rèn)真運(yùn)用synchronization,并對(duì)程序性能停止跟蹤,以肯定沒(méi)有由于新引入的等候時(shí)間而招致系統(tǒng)性能降低。
5.2.防止可變性
這點(diǎn)直接來(lái)自于函數(shù)式編程,并且適用于OOP,聲明應(yīng)該防止類和狀態(tài)的改動(dòng)。簡(jiǎn)而言之,這意味著放棄setter辦法,并在一切模型類上具有私有的final字段。它們的值獨(dú)一發(fā)作變化的時(shí)間是在結(jié)構(gòu)期間。這樣,你能夠肯定不會(huì)呈現(xiàn)爭(zhēng)用問(wèn)題,且訪問(wèn)對(duì)象屬性將一直提供正確的值。
5.3.記載關(guān)鍵數(shù)據(jù)
評(píng)價(jià)你的程序可能會(huì)在何處發(fā)作異常,并預(yù)先記載一切關(guān)鍵數(shù)據(jù)。假如發(fā)作錯(cuò)誤,你將很快樂(lè)能夠得到信息闡明收到了哪些懇求,并可更好地理解你的應(yīng)用程序?yàn)槭裁磿?huì)呈現(xiàn)錯(cuò)誤。需求再次留意的是,日志記載引入了額外的文件I/O,可能會(huì)嚴(yán)重影響應(yīng)用的性能,因而請(qǐng)不要濫用日志。
5.4.復(fù)用現(xiàn)存完成
每當(dāng)你需求創(chuàng)立本人的線程時(shí)(例如:向不同的效勞發(fā)出異步懇求),復(fù)用現(xiàn)有的平安完成來(lái)替代創(chuàng)立本人的處理計(jì)劃。這在很大水平上意味著要運(yùn)用ExecutorServices和Java8簡(jiǎn)約的函數(shù)式CompletableFutures來(lái)創(chuàng)立線程。Spring還允許經(jīng)過(guò)DeferredResult類來(lái)停止異步懇求處置。
6.錯(cuò)誤六:不運(yùn)用基于注解的考證
假定我們之前的TopTalent效勞需求一個(gè)端點(diǎn)來(lái)添加新的TopTalent。此外,假定基于某些緣由,每個(gè)新名詞都需求為10個(gè)字符長(zhǎng)度。執(zhí)行此操作的一種辦法可能如下:
Spring常犯的十大錯(cuò)誤,打死都不要犯
但是,上面的辦法(除了結(jié)構(gòu)很差以外)并不是一個(gè)真正“潔凈”的處理方法。我們正檢查不止一品種型的有效性(即TopTalentData不得為空,TopTalentData.name不得為空,且TopTalentData.name為10個(gè)字符長(zhǎng)度),以及在數(shù)據(jù)無(wú)效時(shí)拋出異常。
經(jīng)過(guò)在Spring中集成Hibernatevalidator,數(shù)據(jù)校驗(yàn)?zāi)軌蚋鼭崈舻赝V埂W屛覀兪紫戎貥?gòu)addTopTalent辦法來(lái)支持考證:
如今,Spring將在調(diào)用辦法之前攔截其懇求并對(duì)參數(shù)停止考證——無(wú)需運(yùn)用額外的手工測(cè)試。
另一種完成相同功用的辦法是創(chuàng)立我們本人的注解。固然你通常只在需求超出Hibernate的內(nèi)置約束集時(shí)才運(yùn)用自定義注解,本例中,我們假定@Length不存在。你能夠創(chuàng)立兩個(gè)額外的類來(lái)考證字符串長(zhǎng)度,一個(gè)用于考證,一個(gè)用于對(duì)屬性停止注解:
請(qǐng)留意,這些狀況下,關(guān)注點(diǎn)別離的最佳理論請(qǐng)求在屬性為null時(shí),將其標(biāo)志為有效(isValid辦法中的s==null),假如這是屬性的附加請(qǐng)求,則運(yùn)用@NotNull注解。
7.錯(cuò)誤七:(照舊)運(yùn)用基于xml的配置
固然之前版本的Spring需求XML,但往常大局部配置均可經(jīng)過(guò)Java代碼或注解來(lái)完成;XML配置只是作為附加的不用要的榜樣代碼。
本文(及其附帶的GitHub倉(cāng)庫(kù))均運(yùn)用注解來(lái)配置Spring,Spring曉得應(yīng)該銜接哪些Bean,由于待掃描的頂級(jí)包目錄已在@SpringBootApplication復(fù)合注解中做了聲明,如下所示:
Spring常犯的十大錯(cuò)誤,打死都不要犯
復(fù)合注解(可經(jīng)過(guò)Spring文檔理解更多信息)只是向Spring提示應(yīng)該掃描哪些包來(lái)檢索Bean。在我們的案例中,這意味著這個(gè)頂級(jí)包(co.kukurin)將用于檢索:
@Component(TopTalentConverter,MyAnnotationValidator)
@RestController(TopTalentController)
@Repository(TopTalentRepository)
@Service(TopTalentService)類
假如我們有任何額外的@Configuration注解類,它們也會(huì)檢查基于Java的配置。
8.錯(cuò)誤八:疏忽profile
在效勞端開發(fā)中,經(jīng)常遇到的一個(gè)問(wèn)題是辨別不同的配置類型,通常是消費(fèi)配置和開發(fā)配置。在每次從測(cè)試切換到部署應(yīng)用程序時(shí),不要手動(dòng)交換各種配置項(xiàng),更有效的辦法是運(yùn)用profile。引薦閱讀:SpringBootProfile不同環(huán)境配置。關(guān)注Java技術(shù)棧微信公眾號(hào),在后臺(tái)回復(fù)關(guān)鍵字:boot,能夠獲取一份棧長(zhǎng)整理的SpringBoot最新技術(shù)干貨。
思索這么一種狀況:你正在運(yùn)用內(nèi)存數(shù)據(jù)庫(kù)停止本地開發(fā),而在消費(fèi)環(huán)境中運(yùn)用MySQL數(shù)據(jù)庫(kù)。實(shí)質(zhì)上,這意味著你需求運(yùn)用不同的URL和(希望如此)不同的憑證來(lái)訪問(wèn)這兩者。讓我們看看能夠如何做到這兩個(gè)不同的配置文件:
8.1.APPLICATION.YAML文件
假定你不希望在修正代碼時(shí)不測(cè)地對(duì)消費(fèi)數(shù)據(jù)庫(kù)停止任何操作,因而將默許配置文件設(shè)為dev是很有意義的。
然后,在效勞器上,你能夠經(jīng)過(guò)提供-Dspring.profiles.active=prod參數(shù)給JVM來(lái)手動(dòng)掩蓋配置文件。另外,還可將操作系統(tǒng)的環(huán)境變量設(shè)置為所需的默許profile。
9.錯(cuò)誤九:無(wú)法承受依賴項(xiàng)注入
正確運(yùn)用Spring的依賴注入意味著允許其經(jīng)過(guò)掃描一切必需的配置類來(lái)將一切對(duì)象銜接在一同;這關(guān)于解耦關(guān)系十分有用,也使測(cè)試變得更為容易,而不是經(jīng)過(guò)類之間的緊耦合來(lái)做這樣的事情:
我們讓Spring為我們做銜接:
MiskoHevery的Googletalk深化解釋了依賴注入的“為什么”,所以,讓我們看看它在理論中是如何運(yùn)用的。在關(guān)注點(diǎn)別離(常見錯(cuò)誤#3)一節(jié)中,我們創(chuàng)立了一個(gè)效勞和控制器類。
假定我們想在TopTalentService行為正確的前提下測(cè)試控制器。我們能夠經(jīng)過(guò)提供一個(gè)單獨(dú)的配置類來(lái)插入一個(gè)模仿對(duì)象來(lái)替代實(shí)踐的效勞完成:
然后,我們能夠經(jīng)過(guò)通知Spring運(yùn)用SampleUnitTestConfig作為它的配置類來(lái)注入模仿對(duì)象:
之后,我們就能夠運(yùn)用上下文配置將Bean注入到單元測(cè)試中。
10.錯(cuò)誤十:缺乏測(cè)試,或測(cè)試不當(dāng)
雖然單元測(cè)試的概念曾經(jīng)存在很長(zhǎng)時(shí)間了,但很多開發(fā)人員似乎要么“遺忘”做這件事(特別是假如它不是“必需”的時(shí)分),要么只是在事后把它添加進(jìn)來(lái)。這顯然是不可取的,由于測(cè)試不只應(yīng)該考證代碼的正確性,還應(yīng)該作為程序在不同場(chǎng)景下應(yīng)如何表現(xiàn)的文檔。
在測(cè)試Web效勞時(shí),很少只停止“純”單元測(cè)試,由于經(jīng)過(guò)HTTP停止通訊通常需求調(diào)用Spring的DispatcherServlet,并查看當(dāng)收到一個(gè)實(shí)踐的HttpServletRequest時(shí)會(huì)發(fā)作什么(使它成為一個(gè)“集成”測(cè)試,處置考證、序列化等)。
RESTAssured,一個(gè)用于簡(jiǎn)化測(cè)試REST效勞的JavaDSL,在MockMVC之上,曾經(jīng)被證明提供了一個(gè)十分文雅的處理計(jì)劃。思索以下帶有依賴項(xiàng)注入的代碼片段:
SampleUnitTestConfig類將TopTalentService的模仿完成銜接到TopTalentController中,而一切的其他類都是經(jīng)過(guò)掃描應(yīng)用類所在包的下級(jí)包目錄來(lái)推斷出的規(guī)范配置。RestAssuredMockMvc只是用來(lái)設(shè)置一個(gè)輕量級(jí)環(huán)境,并向/toptal/get端點(diǎn)發(fā)送一個(gè)GET懇求。

文章標(biāo)簽:

Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)

與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
ciya68