SpringBoot中各個層級結構的具體實現(xiàn)
前言
在SpringBoot項目中,常常會把代碼文件放入不同的包中,例如pojo,dao,service,controller等,但各個層級的代碼是如何聯(lián)系起來的呢,又會在項目中起到怎樣的作用呢
一、各個常用層級簡述
1.POJO層
POJO在springboot項目中的定位,類似于mvc項目里的model模型層。
POJO(Plain Ordinary Java Object)簡單的Java對象,實際就是普通JavaBeans,其中包含多個的屬性,同時具備get/set方法,推薦直接使用@lombok注解。
POJO不會在其中編寫邏輯方法,而且
與數(shù)據(jù)庫表一一對應,屬性也需與數(shù)據(jù)庫表的字段保持一致。
2.DAO層
DAO層用來存放mapper接口,mapper作用為訪問數(shù)據(jù)庫,向數(shù)據(jù)庫發(fā)送sql語句,完成數(shù)據(jù)的增刪改查功能,通常將其實現(xiàn)為接口,內部聲明的方法將會于mapper層中的對應數(shù)據(jù)庫函數(shù)關聯(lián)
其有兩種編寫方式
(1)繼承 BaseMapper,BaseMapper 接口是 MyBatis Plus 提供的通用 Mapper 接口,用于執(zhí)行常用的 CRUD 操作,包括插入、更新、刪除和查詢等操作,繼承該接口后,能夠自動獲得數(shù)據(jù)庫常用操作的方法,而不用在mapper內編寫
public interface UserMapper extends BaseMapper<User>{
}
(2)通過終端調用命令mvn mybatis-generator:generate
需要安裝maven和調用mybatis相關依賴,在使用該命令時,會檢索generatorConfig.xml文件,并根據(jù)其中配置,自動生成DAO層,以及pojo和mapper層的基本文件。
注:需求可通過更改xml配置修改,也可生成后再新編寫邏輯方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry location="E:\software\IDEA\mysql-connector-java-8.0.27.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mall?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8"
userId="root"
password="root">
<!--MySQL 8.x 需要指定服務器的時區(qū)-->
<property name="serverTimezone" value="UTC"/>
<!--MySQL 不支持 schema 或者 catalog 所以需要添加這個-->
<!--參考 : http://www.mybatis.org/generator/usage/mysql.html-->
<property name="nullCatalogMeansCurrent" value="true"/>
<!-- MySQL8默認啟用 SSL ,不關閉會有警告-->
<property name="useSSL" value="false"/>
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="com.imooc.mall.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.imooc.mall.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="數(shù)據(jù)庫表名" domainObjectName="想要生成的pojo類名" enableSelectByExample="false"
enableCountByExample="false" enableDeleteByExample="false" enableUpdateByExample="false"/>
</context>
</generatorConfiguration>
3.SERVICE層
業(yè)務邏輯層,完成功能的設計 和dao層一樣都是先設計接口,再創(chuàng)建要實現(xiàn)的類,然后在配置文件中進行配置其實現(xiàn)的關聯(lián)。
service的impl是把mapper和service進行整合的文件 封裝Service層的業(yè)務邏輯有利于業(yè)務邏輯的獨立性和重復利用性。
基本功能為:
處理業(yè)務邏輯:業(yè)務邏輯是處理數(shù)據(jù)、計算等復雜操作的過程,Service層是業(yè)務邏輯的核心,負責編寫和實現(xiàn)業(yè)務邏輯。
組織DAO(Data Access Object)層:數(shù)據(jù)訪問對象是用來訪問數(shù)據(jù)庫等數(shù)據(jù)存儲的代碼層,Service層通常會調用DAO層的方法來處理數(shù)據(jù)。
實現(xiàn)事務控制:在Service層中實現(xiàn)事務控制,確保操作數(shù)據(jù)庫的過程中數(shù)據(jù)的一致性和完整性。
封裝業(yè)務對象:Service層會封裝業(yè)務邏輯需要的數(shù)據(jù),并將其傳遞給DAO層進行存儲或操作,這樣做可以提高代碼的可讀性和可維護性,以及規(guī)范數(shù)據(jù)的操作。
注意:在service的實現(xiàn)類上要加注解@Service,否則會出現(xiàn)無法掃描識別
4.CONTROLLER層
控制層,控制業(yè)務邏輯service,控制請求和響應,負責前后端交互
controller層主要調用Service層里面的接口控制具體的業(yè)務流程,不會在其中編寫大量邏輯代碼,同時也會接受并處理一些HTTP參數(shù),例如session
注意:在CONTROLLER的實現(xiàn)類上也要加注解@RestController
5.mapper層
存放數(shù)據(jù)庫函數(shù),與DAO層中的方法映射,可通過終端命令生成,也可自行編寫(工作量較大),在調用DAO方法則會實際執(zhí)行mapper層對應的數(shù)據(jù)庫方法,是對數(shù)據(jù)庫curd的接口橋梁,同時也需要增加mapper掃描以完成識別
二、其余包/層級
1.ENUM 枚舉包
在真正項目編寫中,通常會遇到根據(jù)不同情況設定不同返回值,而直接大量設置int不僅會存在安全漏洞,也會出現(xiàn)閱讀及理解上的困難,所以通過枚舉可以很好的解決這些問題
@Getter
public enum ProductStatusEnum {
ON_SALE(1),
OFF_SALE(2),
DELETE(3),
;
Integer code;
ProductStatusEnum(Integer code) {
this.code = code;
}
}
其中@Getter注解不可缺少,因為需要取枚舉值,也就是取code時,需要調用其提供的getCode()方法
2.VO 返回對象包
由于springboot項目一般采用前后端分離,不同層不同方法返回給前端的數(shù)據(jù)的格式有時會與POJO中的屬性不完全一致,可能增多也可能缺少,于是直接構建一個用于構造返回對象的包,根據(jù)需求出發(fā),與前端所需數(shù)據(jù)類型保持完全一致。
VO類的結構完全類似于POJO類,同樣存放一定量的屬性+lombok注解(@Data)即可
3.EXCEPTION 報錯包
由于項目中的一些報錯并不是邏輯性報錯,在正常運行項目中可能會存在不危險的報錯,并需要對其按報錯類型做不同處理
通過@ExceptionHandler(RuntimeException.class)注解,更改括號內的報錯類名,捕捉不同的報錯,并編寫對應的報錯處理方法。
4.FORM 表單包
有時在項目中對傳入的數(shù)據(jù)對象的參數(shù)進行校驗,通過對其添加 注解 即可
注解包為javax.validation.constraints,需要引入依賴
@Null 被注解的元素必須為null
@NotNull 被注解的元素必須不為null
@AssertTrue 被注解的元素必須為true
@AssertFalse 被注解的元素必須為false
@Min(value) 被注解的元素必須為數(shù)字,其值必須大于等于最小值
@Max(value) 被注解的元素必須為數(shù)字,其值必須小于等于最小值
@Size(max,min) 被注解的元素的大小必須在指定范圍內
@Past 被注解的元素必須為過去的一個時間
@Future 被注解的元素必須為未來的一個時間
@Pattern 被注解的元素必須符合指定的正則表達式
5.攔截器
攔截器的主要是基于Java的反射機制,屬于面向切面編程(AOP)的一種運用,就是在Service或者一個方法前調用一個方法,或者在方法后調用一個方法,甚至在拋出異常的時候做業(yè)務邏輯的操作。
攔截器的作用類似于Servlet 中的Filter,都可以用于對處理器進行預處理和后處理。在Spring MVC 與Spring Boot 中使用攔截器一般是實現(xiàn)HandlerInterceptor 接口
該接口有三個方法
(1)preHandle():這個方法可以實現(xiàn)處理器的預處理,也就是它會在handler 方法執(zhí)行之前就開始執(zhí)行。當返回值是true 時表示繼續(xù)執(zhí)行,返回false 時則不會執(zhí)行后續(xù)的攔截器或處理器。作用:身份驗證,身份授權等。
(2)postHandle():這個方法是后處理回調方法,也就是在控制器完成后(試圖渲染之前)執(zhí)行。作用:將公用的模型數(shù)據(jù)傳到視圖,也可以在這里統(tǒng)一指定視圖(菜單導航等)。
(3)afterCompletion():這個方法是請求處理完畢后的回調方法,即在視圖渲染完畢時調用。作用:進行統(tǒng)一的異常處理,日志處理等。
實現(xiàn)接口后對需要的方法進行重寫,編寫項目所對應的攔截器邏輯代碼。但有時候部分鏈接需要對外部開放,而不能被攔截器所攔截,例如登錄接口,注冊接口等,需要另外編寫一個類 實現(xiàn) WebMvcConfigurer接口
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserLoginIntercepter())
.addPathPatterns("/**")
.excludePathPatterns("/error", "/user/login", "/user/register");
}
}
addInterceptor:需要一個實現(xiàn)HandlerInterceptor接口的攔截器實例
addPathPatterns:用于設置攔截器的過濾路徑規(guī)則;addPathPatterns(“/**”)對所有請求都攔截
excludePathPatterns:用于設置不需要攔截的過濾規(guī)則(白名單)
注意 @Configuration注解不可省略,不然攔截器可能配置無效
此處只講解 WebMvcConfigurer接口在攔截器的運用,它還有很多其他的功能,想了解的可以看看這篇博客
https://blog.csdn.net/weixin_45433031/article/details/121846207
三、各個層級之間的聯(lián)系與作用
三層架構
從基礎的三層架構開始說起吧,三層架構由 Dao 層,Service層,Controller層組成,在這個三層架構之中,Dao層負責與mybatis和數(shù)據(jù)庫打交道,實現(xiàn)對持久化數(shù)據(jù)的訪問,隔離業(yè)務邏輯代碼和數(shù)據(jù)訪問代碼,隔離不同數(shù)據(jù)庫的實現(xiàn)。
而Service則是負責編寫業(yè)務邏輯的一個層,一般Service層由接口和實現(xiàn)類構成,存在大量業(yè)務方法,以供Controller層的調用。在SpringBoot項目中,編寫業(yè)務邏輯時,常常會聲明一個由@Autowired 注釋的XXXmapper對象,該對象為Dao層接口的實現(xiàn)類,以供其調用。
Controller,控制器層,controller層的功能為請求和響應控制。
Controller層負責前后端交互,接受前端請求,調用service層,接收service層返回的數(shù)據(jù),最后返回具體的頁面和數(shù)據(jù)到客戶端。請注意:部分返回數(shù)據(jù)隊格式和數(shù)量都有所要求,要注意前端需求并構建響應的Vo對象返回為佳
數(shù)據(jù)持久化:將數(shù)據(jù)存入數(shù)據(jù)庫中,將數(shù)據(jù)庫中的數(shù)據(jù)讀取出來的過程,稱之為持久,持久化是將程序中的數(shù)據(jù)在瞬時狀態(tài)和持久狀態(tài)間轉換的機制
到此這篇關于SpringBoot中各個層級結構的具體實現(xiàn)的文章就介紹到這了,更多相關SpringBoot 各個層級結構內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SocketIo+SpringMvc實現(xiàn)文件的上傳下載功能
這篇文章主要介紹了SocketIo+SpringMvc實現(xiàn)文件的上傳下載功能,socketIo不僅可以用來做聊天工具,也可以實現(xiàn)局域網(wǎng)。文中給出了實現(xiàn)代碼,需要的朋友可以參考下2018-08-08
tomcat connection-timeout連接超時源碼解析
這篇文章主要為大家介紹了tomcat connection-timeout連接超時源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

