摘要:典型示例以下結(jié)構(gòu)是比較推薦的組織方式,所有的類和其他都在之下。應(yīng)用主類,該類直接位于下。默認(rèn)情況下,的應(yīng)用主類會自動掃描以及所有子包下的所有類來進(jìn)行初始化。
Spring Boot框架本身并沒有對工程結(jié)構(gòu)有特別的要求,但是按照最佳實踐的工程結(jié)構(gòu)可以幫助我們減少可能會遇見的坑,尤其是Spring包掃描機(jī)制的存在,如果您使用最佳實踐的工程結(jié)構(gòu),可以免去不少特殊的配置工作。
典型示例以下結(jié)構(gòu)是比較推薦的package組織方式:
com +- example +- myproject +- Application.java | +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- web | +- CustomerController.java |
root package:com.example.myproject,所有的類和其他package都在root package之下。
應(yīng)用主類:Application.java,該類直接位于root package下。通常我們會在應(yīng)用主類中做一些框架配置掃描等配置,我們放在root package下可以幫助程序減少手工配置來加載到我們希望被Spring加載的內(nèi)容
com.example.myproject.domain包:用于定義實體映射關(guān)系與數(shù)據(jù)訪問相關(guān)的接口和實現(xiàn)
com.example.myproject.service包:用于編寫業(yè)務(wù)邏輯相關(guān)的接口與實現(xiàn)
com.example.myproject.web:用于編寫Web層相關(guān)的實現(xiàn),比如:Spring MVC的Controller等
上面的結(jié)構(gòu)中,root package與應(yīng)用主類的位置是整個結(jié)構(gòu)的關(guān)鍵。由于應(yīng)用主類在root package中,所以按照上面的規(guī)則定義的所有其他類都處于root package下的其他子包之后。默認(rèn)情況下,Spring Boot的應(yīng)用主類會自動掃描root package以及所有子包下的所有類來進(jìn)行初始化。
什么意思呢?舉個例子,假設(shè)我們將com.example.myproject.web包與上面所述的root package:com.example.myproject放在同一級,像下面這樣:
com +- example +- myproject +- Application.java | +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- web | +- CustomerController.java |
這個時候,應(yīng)用主類Application.java在默認(rèn)情況下就無法掃描到com.example.myproject.web中的Controller定義,就無法初始化Controller中定義的接口。
非典型結(jié)構(gòu)下的初始化那么如果,我們一定要加載非root package下的內(nèi)容怎么辦呢?
方法一:使用@ComponentScan注解指定具體的加載包,比如:
@SpringBootApplication @ComponentScan(basePackages="com.example") public class Bootstrap { public static void main(String[] args) { SpringApplication.run(Bootstrap.class, args); } }
這種方法通過注解直接指定要掃描的包,比較直觀。如果有這樣的需求也是可以用的,但是原則上還是推薦以上面的典型結(jié)構(gòu)來定義,這樣也可以少寫一些注解,代碼更加簡潔。
方法二:使用@Bean注解來初始化,比如:
@SpringBootApplication public class Bootstrap { public static void main(String[] args) { SpringApplication.run(Bootstrap.class, args); } @Bean public CustomerController customerController() { return new CustomerController(); } }
這種方法在業(yè)務(wù)開發(fā)的時候并不是特別推薦,更適合用于框架封裝等場景,關(guān)于更多封裝上的技巧,后面我們在進(jìn)階教程中詳細(xì)講解。
如果讀者覺得自己團(tuán)隊使用的工程結(jié)構(gòu)不錯,歡迎留言分享~
代碼示例本教程配套倉庫:
Github:https://github.com/dyc87112/SpringBoot-Learning/tree/2.x
Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/2.x
如果您覺得本文不錯,歡迎Star支持,您的關(guān)注是我堅持的動力!
專欄推薦Spring Boot從入門到精通
Spring Cloud從入門到精通
關(guān)聯(lián)內(nèi)容Spring Boot工程結(jié)構(gòu)推薦 - 1.x版本
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77609.html
摘要:編寫一個接口創(chuàng)建命名為根據(jù)實際情況修改創(chuàng)建類,內(nèi)容如下啟動主程序,使用等工具發(fā)起請求,可以看到頁面返回編寫單元測試用例打開的下的測試入口類。 簡介 在您第1次接觸和學(xué)習(xí)Spring框架的時候,是否因為其繁雜的配置而退卻了?在你第n次使用Spring框架的時候,是否覺得一堆反復(fù)黏貼的配置有一些厭煩?那么您就不妨來試試使用Spring Boot來讓你更易上手,更簡單快捷地構(gòu)建Spring應(yīng)...
摘要:數(shù)據(jù)和信息是不可分離的,數(shù)據(jù)是信息的表達(dá),信息是數(shù)據(jù)的內(nèi)涵。數(shù)據(jù)本身沒有意義,數(shù)據(jù)只有對實體行為產(chǎn)生影響時才成為信息。主要目標(biāo)是為開發(fā)提供天然的模板,并且能在里面準(zhǔn)確的顯示。目前是自然更加推薦。 這是泥瓦匠的第105篇原創(chuàng) 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-4-thym...
摘要:使用則需要及以上版本。開發(fā)使用框架七系列教程目錄系列教程大綱快速入門實踐實踐整合整合中和實踐整合中實現(xiàn)緩存中實現(xiàn)通信集成測試及部署實戰(zhàn)圖書管理系統(tǒng) WebFlux 系列教程大綱 一、背景 大家都知道,Spring Framework 是 Java/Spring 應(yīng)用程序跨平臺開發(fā)框架,也是 Java EE(Java Enterprise Edition) 輕量級框架,其 Spring ...
摘要:挺多人咨詢的,異常處理用切面注解去實現(xiàn)去全局異常處理。全局異常處理類,代碼如下代碼解析如下抽象類是用來處理全局錯誤時進(jìn)行擴(kuò)展和實現(xiàn)注解標(biāo)記的切面排序,值越小擁有越高的優(yōu)先級,這里設(shè)置優(yōu)先級偏高。 本文內(nèi)容 為什么要全局異常處理? WebFlux REST 全局異常處理實戰(zhàn) 小結(jié) 摘錄:只有不斷培養(yǎng)好習(xí)慣,同時不斷打破壞習(xí)慣,我們的行為舉止才能夠自始至終都是正確的。 一、為什么要全局...
摘要:響應(yīng)式編程是基于異步和事件驅(qū)動的非阻塞程序,只是垂直通過在內(nèi)啟動少量線程擴(kuò)展,而不是水平通過集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對日志消息測試及擴(kuò)展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...
閱讀 1037·2023-04-25 17:51
閱讀 2852·2021-11-23 09:51
閱讀 1470·2021-11-08 13:21
閱讀 2428·2021-09-22 15:14
閱讀 1515·2019-08-30 12:48
閱讀 1076·2019-08-29 12:44
閱讀 1138·2019-08-26 12:21
閱讀 1396·2019-08-26 10:47