欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn)

 更新時(shí)間:2024年05月24日 11:27:16   作者:ZHI_YUE  
在SpringBoot項(xiàng)目中,常常會(huì)把代碼文件放入不同的包中,本文主要介紹了SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

前言

在SpringBoot項(xiàng)目中,常常會(huì)把代碼文件放入不同的包中,例如pojo,dao,service,controller等,但各個(gè)層級(jí)的代碼是如何聯(lián)系起來的呢,又會(huì)在項(xiàng)目中起到怎樣的作用呢

一、各個(gè)常用層級(jí)簡(jiǎn)述

1.POJO層

POJO在springboot項(xiàng)目中的定位,類似于mvc項(xiàng)目里的model模型層。
POJO(Plain Ordinary Java Object)簡(jiǎn)單的Java對(duì)象,實(shí)際就是普通JavaBeans,其中包含多個(gè)的屬性,同時(shí)具備get/set方法,推薦直接使用@lombok注解。
POJO不會(huì)在其中編寫邏輯方法,而且
與數(shù)據(jù)庫表一一對(duì)應(yīng),屬性也需與數(shù)據(jù)庫表的字段保持一致。

2.DAO層

DAO層用來存放mapper接口,mapper作用為訪問數(shù)據(jù)庫,向數(shù)據(jù)庫發(fā)送sql語句,完成數(shù)據(jù)的增刪改查功能,通常將其實(shí)現(xiàn)為接口,內(nèi)部聲明的方法將會(huì)于mapper層中的對(duì)應(yīng)數(shù)據(jù)庫函數(shù)關(guān)聯(lián)

其有兩種編寫方式
(1)繼承 BaseMapper,BaseMapper 接口是 MyBatis Plus 提供的通用 Mapper 接口,用于執(zhí)行常用的 CRUD 操作,包括插入、更新、刪除和查詢等操作,繼承該接口后,能夠自動(dòng)獲得數(shù)據(jù)庫常用操作的方法,而不用在mapper內(nèi)編寫

public interface UserMapper extends BaseMapper<User>{
    
}

(2)通過終端調(diào)用命令mvn mybatis-generator:generate
需要安裝maven和調(diào)用mybatis相關(guān)依賴,在使用該命令時(shí),會(huì)檢索generatorConfig.xml文件,并根據(jù)其中配置,自動(dòng)生成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&amp;useSSL=false&amp;serverTimezone=GMT%2b8"
                        userId="root"
                        password="root">
            <!--MySQL 8.x 需要指定服務(wù)器的時(shí)區(qū)-->
            <property name="serverTimezone" value="UTC"/>
            <!--MySQL 不支持 schema 或者 catalog 所以需要添加這個(gè)-->
            <!--參考 : http://www.mybatis.org/generator/usage/mysql.html-->
            <property name="nullCatalogMeansCurrent" value="true"/>
            <!-- MySQL8默認(rèn)啟用 SSL ,不關(guān)閉會(huì)有警告-->
            <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è)務(wù)邏輯層,完成功能的設(shè)計(jì) 和dao層一樣都是先設(shè)計(jì)接口,再創(chuàng)建要實(shí)現(xiàn)的類,然后在配置文件中進(jìn)行配置其實(shí)現(xiàn)的關(guān)聯(lián)。
service的impl是把mapper和service進(jìn)行整合的文件 封裝Service層的業(yè)務(wù)邏輯有利于業(yè)務(wù)邏輯的獨(dú)立性和重復(fù)利用性。
基本功能為:

  • 處理業(yè)務(wù)邏輯:業(yè)務(wù)邏輯是處理數(shù)據(jù)、計(jì)算等復(fù)雜操作的過程,Service層是業(yè)務(wù)邏輯的核心,負(fù)責(zé)編寫和實(shí)現(xiàn)業(yè)務(wù)邏輯。

  • 組織DAO(Data Access Object)層:數(shù)據(jù)訪問對(duì)象是用來訪問數(shù)據(jù)庫等數(shù)據(jù)存儲(chǔ)的代碼層,Service層通常會(huì)調(diào)用DAO層的方法來處理數(shù)據(jù)。

  • 實(shí)現(xiàn)事務(wù)控制:在Service層中實(shí)現(xiàn)事務(wù)控制,確保操作數(shù)據(jù)庫的過程中數(shù)據(jù)的一致性和完整性。

  • 封裝業(yè)務(wù)對(duì)象:Service層會(huì)封裝業(yè)務(wù)邏輯需要的數(shù)據(jù),并將其傳遞給DAO層進(jìn)行存儲(chǔ)或操作,這樣做可以提高代碼的可讀性和可維護(hù)性,以及規(guī)范數(shù)據(jù)的操作。

注意:在service的實(shí)現(xiàn)類上要加注解@Service,否則會(huì)出現(xiàn)無法掃描識(shí)別

4.CONTROLLER層

控制層,控制業(yè)務(wù)邏輯service,控制請(qǐng)求和響應(yīng),負(fù)責(zé)前后端交互
controller層主要調(diào)用Service層里面的接口控制具體的業(yè)務(wù)流程,不會(huì)在其中編寫大量邏輯代碼,同時(shí)也會(huì)接受并處理一些HTTP參數(shù),例如session

注意:在CONTROLLER的實(shí)現(xiàn)類上也要加注解@RestController

5.mapper層

存放數(shù)據(jù)庫函數(shù),與DAO層中的方法映射,可通過終端命令生成,也可自行編寫(工作量較大),在調(diào)用DAO方法則會(huì)實(shí)際執(zhí)行mapper層對(duì)應(yīng)的數(shù)據(jù)庫方法,是對(duì)數(shù)據(jù)庫curd的接口橋梁,同時(shí)也需要增加mapper掃描以完成識(shí)別

二、其余包/層級(jí)

1.ENUM 枚舉包

在真正項(xiàng)目編寫中,通常會(huì)遇到根據(jù)不同情況設(shè)定不同返回值,而直接大量設(shè)置int不僅會(huì)存在安全漏洞,也會(huì)出現(xiàn)閱讀及理解上的困難,所以通過枚舉可以很好的解決這些問題

@Getter
public enum ProductStatusEnum {
    ON_SALE(1),
    OFF_SALE(2),
    DELETE(3),
    ;
    Integer code;

    ProductStatusEnum(Integer code) {
        this.code = code;
    }

}

其中@Getter注解不可缺少,因?yàn)樾枰∶杜e值,也就是取code時(shí),需要調(diào)用其提供的getCode()方法

2.VO 返回對(duì)象包

由于springboot項(xiàng)目一般采用前后端分離,不同層不同方法返回給前端的數(shù)據(jù)的格式有時(shí)會(huì)與POJO中的屬性不完全一致,可能增多也可能缺少,于是直接構(gòu)建一個(gè)用于構(gòu)造返回對(duì)象的包,根據(jù)需求出發(fā),與前端所需數(shù)據(jù)類型保持完全一致。
VO類的結(jié)構(gòu)完全類似于POJO類,同樣存放一定量的屬性+lombok注解(@Data)即可

3.EXCEPTION 報(bào)錯(cuò)包

由于項(xiàng)目中的一些報(bào)錯(cuò)并不是邏輯性報(bào)錯(cuò),在正常運(yùn)行項(xiàng)目中可能會(huì)存在不危險(xiǎn)的報(bào)錯(cuò),并需要對(duì)其按報(bào)錯(cuò)類型做不同處理
通過@ExceptionHandler(RuntimeException.class)注解,更改括號(hào)內(nèi)的報(bào)錯(cuò)類名,捕捉不同的報(bào)錯(cuò),并編寫對(duì)應(yīng)的報(bào)錯(cuò)處理方法。

4.FORM 表單包

有時(shí)在項(xiàng)目中對(duì)傳入的數(shù)據(jù)對(duì)象的參數(shù)進(jìn)行校驗(yàn),通過對(duì)其添加 注解 即可
注解包為javax.validation.constraints,需要引入依賴
@Null 被注解的元素必須為null
@NotNull 被注解的元素必須不為null
@AssertTrue 被注解的元素必須為true
@AssertFalse 被注解的元素必須為false
@Min(value) 被注解的元素必須為數(shù)字,其值必須大于等于最小值
@Max(value) 被注解的元素必須為數(shù)字,其值必須小于等于最小值
@Size(max,min) 被注解的元素的大小必須在指定范圍內(nèi)
@Past 被注解的元素必須為過去的一個(gè)時(shí)間
@Future 被注解的元素必須為未來的一個(gè)時(shí)間
@Pattern 被注解的元素必須符合指定的正則表達(dá)式

5.攔截器

攔截器的主要是基于Java的反射機(jī)制,屬于面向切面編程(AOP)的一種運(yùn)用,就是在Service或者一個(gè)方法前調(diào)用一個(gè)方法,或者在方法后調(diào)用一個(gè)方法,甚至在拋出異常的時(shí)候做業(yè)務(wù)邏輯的操作。

攔截器的作用類似于Servlet 中的Filter,都可以用于對(duì)處理器進(jìn)行預(yù)處理和后處理。在Spring MVC 與Spring Boot 中使用攔截器一般是實(shí)現(xiàn)HandlerInterceptor 接口

該接口有三個(gè)方法
(1)preHandle():這個(gè)方法可以實(shí)現(xiàn)處理器的預(yù)處理,也就是它會(huì)在handler 方法執(zhí)行之前就開始執(zhí)行。當(dāng)返回值是true 時(shí)表示繼續(xù)執(zhí)行,返回false 時(shí)則不會(huì)執(zhí)行后續(xù)的攔截器或處理器。作用:身份驗(yàn)證,身份授權(quán)等。
(2)postHandle():這個(gè)方法是后處理回調(diào)方法,也就是在控制器完成后(試圖渲染之前)執(zhí)行。作用:將公用的模型數(shù)據(jù)傳到視圖,也可以在這里統(tǒng)一指定視圖(菜單導(dǎo)航等)。
(3)afterCompletion():這個(gè)方法是請(qǐng)求處理完畢后的回調(diào)方法,即在視圖渲染完畢時(shí)調(diào)用。作用:進(jìn)行統(tǒng)一的異常處理,日志處理等。

實(shí)現(xiàn)接口后對(duì)需要的方法進(jìn)行重寫,編寫項(xiàng)目所對(duì)應(yīng)的攔截器邏輯代碼。但有時(shí)候部分鏈接需要對(duì)外部開放,而不能被攔截器所攔截,例如登錄接口,注冊(cè)接口等,需要另外編寫一個(gè)類 實(shí)現(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:需要一個(gè)實(shí)現(xiàn)HandlerInterceptor接口的攔截器實(shí)例
addPathPatterns:用于設(shè)置攔截器的過濾路徑規(guī)則;addPathPatterns(“/**”)對(duì)所有請(qǐng)求都攔截
excludePathPatterns:用于設(shè)置不需要攔截的過濾規(guī)則(白名單)
注意 @Configuration注解不可省略,不然攔截器可能配置無效

此處只講解 WebMvcConfigurer接口在攔截器的運(yùn)用,它還有很多其他的功能,想了解的可以看看這篇博客
https://blog.csdn.net/weixin_45433031/article/details/121846207

三、各個(gè)層級(jí)之間的聯(lián)系與作用

三層架構(gòu)

從基礎(chǔ)的三層架構(gòu)開始說起吧,三層架構(gòu)由 Dao 層,Service層,Controller層組成,在這個(gè)三層架構(gòu)之中,Dao層負(fù)責(zé)與mybatis和數(shù)據(jù)庫打交道,實(shí)現(xiàn)對(duì)持久化數(shù)據(jù)的訪問,隔離業(yè)務(wù)邏輯代碼和數(shù)據(jù)訪問代碼,隔離不同數(shù)據(jù)庫的實(shí)現(xiàn)。

而Service則是負(fù)責(zé)編寫業(yè)務(wù)邏輯的一個(gè)層,一般Service層由接口和實(shí)現(xiàn)類構(gòu)成,存在大量業(yè)務(wù)方法,以供Controller層的調(diào)用。在SpringBoot項(xiàng)目中,編寫業(yè)務(wù)邏輯時(shí),常常會(huì)聲明一個(gè)由@Autowired 注釋的XXXmapper對(duì)象,該對(duì)象為Dao層接口的實(shí)現(xiàn)類,以供其調(diào)用。

Controller,控制器層,controller層的功能為請(qǐng)求和響應(yīng)控制。
Controller層負(fù)責(zé)前后端交互,接受前端請(qǐng)求,調(diào)用service層,接收service層返回的數(shù)據(jù),最后返回具體的頁面和數(shù)據(jù)到客戶端。請(qǐng)注意:部分返回?cái)?shù)據(jù)隊(duì)格式和數(shù)量都有所要求,要注意前端需求并構(gòu)建響應(yīng)的Vo對(duì)象返回為佳

數(shù)據(jù)持久化:將數(shù)據(jù)存入數(shù)據(jù)庫中,將數(shù)據(jù)庫中的數(shù)據(jù)讀取出來的過程,稱之為持久,持久化是將程序中的數(shù)據(jù)在瞬時(shí)狀態(tài)和持久狀態(tài)間轉(zhuǎn)換的機(jī)制

到此這篇關(guān)于SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot 各個(gè)層級(jí)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解

    Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解

    這篇文章主要介紹了Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫中的一個(gè)類,BeanMap?可以將?Java?對(duì)象的屬性作為鍵,屬性值作為對(duì)應(yīng)的值,存儲(chǔ)在一個(gè)?Map?中,它提供了一種將?Java?對(duì)象轉(zhuǎn)換為?Map?的方式,需要的朋友可以參考下
    2024-01-01
  • spring實(shí)例化javabean的三種方式分享

    spring實(shí)例化javabean的三種方式分享

    這篇文章介紹了spring實(shí)例化javabean的三種方式,有需要的朋友可以參考一下
    2013-10-10
  • HashMap容量和負(fù)載因子使用說明

    HashMap容量和負(fù)載因子使用說明

    這篇文章主要介紹了HashMap容量和負(fù)載因子使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot disruptor高性能隊(duì)列使用

    SpringBoot disruptor高性能隊(duì)列使用

    這篇文章主要介紹了SpringBoot disruptor高性能隊(duì)列使用,Disruptor是英國(guó)外匯交易公司LMAX開發(fā)的一個(gè)高性能隊(duì)列,研發(fā)的初衷是解決內(nèi)存隊(duì)列的延遲問題
    2023-02-02
  • SocketIo+SpringMvc實(shí)現(xiàn)文件的上傳下載功能

    SocketIo+SpringMvc實(shí)現(xiàn)文件的上傳下載功能

    這篇文章主要介紹了SocketIo+SpringMvc實(shí)現(xiàn)文件的上傳下載功能,socketIo不僅可以用來做聊天工具,也可以實(shí)現(xiàn)局域網(wǎng)。文中給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2018-08-08
  • Java數(shù)組的去重

    Java數(shù)組的去重

    這篇文章主要介紹了Java數(shù)組去重,結(jié)合實(shí)例形式分析了Java針對(duì)數(shù)組的去重,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • tomcat connection-timeout連接超時(shí)源碼解析

    tomcat connection-timeout連接超時(shí)源碼解析

    這篇文章主要為大家介紹了tomcat connection-timeout連接超時(shí)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • spring解決循環(huán)依賴的方案示例

    spring解決循環(huán)依賴的方案示例

    這篇文章主要介紹spring如何解決循環(huán)依賴,文中有相關(guān)的代碼示例給大家參考,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以借鑒閱讀
    2023-05-05
  • scala 匿名函數(shù)案例詳解

    scala 匿名函數(shù)案例詳解

    Scala支持一級(jí)函數(shù),函數(shù)可以用函數(shù)文字語法表達(dá),即(x:Int)=> x + 1,該函數(shù)可以由一個(gè)叫作函數(shù)值的對(duì)象來表示,這篇文章主要介紹了scala 匿名函數(shù)詳解,需要的朋友可以參考下
    2023-03-03
  • Java+TestNG接口自動(dòng)化入門詳解

    Java+TestNG接口自動(dòng)化入門詳解

    本文主要介紹了Java+TestNG接口自動(dòng)化入門,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論