最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java基于虹軟實(shí)現(xiàn)人臉識(shí)別、人臉比對(duì)、活性檢測(cè)等

 更新時(shí)間:2022年02月21日 14:49:45   作者:lytao123  
本文主要介紹了Java基于虹軟實(shí)現(xiàn)人臉識(shí)別、人臉比對(duì)、活性檢測(cè)等,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

虹軟

  • 免費(fèi),高級(jí)版本試用
  • 支持在線、離線
  • 有 Java SDK,C++ SDK

一、注冊(cè)虹軟開發(fā)者平臺(tái)

點(diǎn)擊注冊(cè)

在這里插入圖片描述

注冊(cè)完成后可在“我的應(yīng)用”中新建應(yīng)用,獲得 APP_IDSDK_Key,請(qǐng)記住這兩個(gè)信息,后續(xù) SDK 中會(huì)用到。

在這里插入圖片描述

接下來下載SDK就行了。

二、開始使用SDK

SDK包結(jié)構(gòu)
在下載的sdk包中,包結(jié)構(gòu)大概是這樣

|—demo
| |—ArcFaceDemo Demo工程
|—doc
| |—ARCSOFT_ARC_FACE_DEVELOPER’S_GUIDE.PDF 開發(fā)說明文檔
|—inc
| |—amcomdef.h 平臺(tái)文件
| |—asvloffscreen.h 平臺(tái)文件
| |—arcsoft_face_sdk.h 接口文件
| |—merror.h 錯(cuò)誤碼文件
|—lib
|—|---Win32/x64
| |—|---libarcsoft_face.dll 算法庫
| |—|---libarcsoft_face_engine.dll 引擎庫
| |—|---libarcsoft_face_engine.lib 引擎庫
|—samplecode
| |—samplecode.cpp 示例代碼
|—releasenotes.txt 說明文件

在項(xiàng)目中引入 SDK 包

<dependency>
    <groupId>arcsoft</groupId>
    <artifactId>arcsoft-sdk-face</artifactId>
    <version>3.0.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
</dependency>

簡(jiǎn)單的集成

package com.study;

import com.arcsoft.face.*;
import com.arcsoft.face.enums.*;
import com.arcsoft.face.toolkit.ImageFactory;
import com.arcsoft.face.toolkit.ImageInfo;
import com.arcsoft.face.toolkit.ImageInfoEx;
import com.study.exception.CustomException;
import com.study.vo.FaceDetailInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * 集成虹軟-人臉識(shí)別測(cè)試
 *
 * @author ouyangrongtao
 * @since 2022-02-20 19:12
 */
public class FaceEngineMain {

    // 從上述的開發(fā)者平臺(tái)-“我的應(yīng)用” 獲取
    private static final String APP_ID = "";
    private static final String SDK_KEY = "";

    // sdk安裝路徑
    private static final String ARC_FACE_PATH = "arcsoft";

    private static final Logger LOGGER = LoggerFactory.getLogger(FaceEngineMain.class);

    public static void main(String[] args) {
        FaceEngineMain faceEngineMain = new FaceEngineMain();
        // 激活
        FaceEngine faceEngine = faceEngineMain.active();
        // 識(shí)別功能配置
        FunctionConfiguration functionConfiguration = faceEngineMain.getFunctionConfiguration();
        // 初始化識(shí)別引擎
        faceEngineMain.initEngine(faceEngine, functionConfiguration);

        ImageInfo imageInfo = ImageFactory.getRGBData(new File("d:\\aaa.jpeg"));
        ImageInfo imageInfo2 = ImageFactory.getRGBData(new File("d:\\bbb.jpeg"));

        // 人臉檢測(cè)&特征提取1
        List<FaceDetailInfo> faceDetailInfoList1 = faceEngineMain.detectFaces(faceEngine, imageInfo);

        // 人臉檢測(cè)&特征提取2
        List<FaceDetailInfo> faceDetailInfoList2 = faceEngineMain.detectFaces(faceEngine, imageInfo2);

        /*
         * 特征比對(duì)
         * 用于證件照或生活照與證件照之間的特征比對(duì),推薦閾值0.82
         * 用于生活照之間的特征比對(duì),推薦閾值0.80
         */
        FaceSimilar faceSimilar = faceEngineMain.compareFaceFeature(faceEngine,
                faceDetailInfoList1.get(0).getFaceFeature(), faceDetailInfoList2.get(0).getFaceFeature());
        LOGGER.info("相似度:{}", faceSimilar.getScore());

        // 獲取人臉屬性
        faceEngineMain.getFaceAttributes(faceEngine, imageInfo);

        ImageInfo imageInfo3 = ImageFactory.getRGBData(new File("d:\\ccc.jpg"));
        ImageInfo imageInfo4 = ImageFactory.getRGBData(new File("d:\\ddd.jpg"));

        // 人臉檢測(cè)&特征提取3
        List<FaceDetailInfo> faceDetailInfoList3 = faceEngineMain.detectFacesEx(faceEngine, imageInfo3, DetectModel.ASF_DETECT_MODEL_RGB);

        // 人臉檢測(cè)&特征提取4
        List<FaceDetailInfo> faceDetailInfoList4 = faceEngineMain.detectFacesEx(faceEngine, imageInfo4, DetectModel.ASF_DETECT_MODEL_RGB);

        // 特征比對(duì)
        FaceSimilar faceSimilar2 = faceEngineMain.compareFaceFeature(faceEngine,
                faceDetailInfoList3.get(0).getFaceFeature(), faceDetailInfoList4.get(0).getFaceFeature(), CompareModel.LIFE_PHOTO);
        /*
         * 特征比對(duì)
         * 用于證件照或生活照與證件照之間的特征比對(duì),推薦閾值0.82
         * 用于生活照之間的特征比對(duì),推薦閾值0.80
         */
        LOGGER.info("相似度:{}", faceSimilar2.getScore());

        // 獲取人臉屬性
        faceEngineMain.getFaceAttributesEx(faceEngine, imageInfo);

        ImageInfo imageInfoGray = ImageFactory.getGrayData(new File("d:\\ddd.jpg"));

        // 活體檢測(cè) RGB & IR
        faceEngineMain.getLiveness(faceEngine, imageInfo, imageInfoGray);

        // 卸載
        faceEngineMain.unInit(faceEngine);
    }

    /**
     * 活體檢測(cè)
     * @param faceEngine 引擎
     * @param imageInfoRGB RGB圖片信息
     * @param imageInfoGray Gray圖片信息
     */
    private void getLiveness(FaceEngine faceEngine, ImageInfo imageInfoRGB, ImageInfo imageInfoGray) {
        // 人臉檢測(cè)
        List<FaceInfo> faceInfoList = new ArrayList<>();
        faceEngine.detectFaces(imageInfoRGB.getImageData(),
                imageInfoRGB.getWidth(), imageInfoRGB.getHeight(), imageInfoRGB.getImageFormat(), faceInfoList);
        // 設(shè)置活體測(cè)試閥值
        faceEngine.setLivenessParam(0.5f, 0.7f);

        // RGB人臉檢測(cè)
        FunctionConfiguration configuration = new FunctionConfiguration();
        configuration.setSupportLiveness(true);
        faceEngine.process(imageInfoRGB.getImageData(),
                imageInfoRGB.getWidth(), imageInfoRGB.getHeight(), imageInfoRGB.getImageFormat(), faceInfoList, configuration);

        // RGB活體檢測(cè)
        List<LivenessInfo> livenessInfoList = new ArrayList<>();
        faceEngine.getLiveness(livenessInfoList);
        LOGGER.info("RGB活體:{}", livenessInfoList.get(0).getLiveness());

        // IR屬性處理
        List<FaceInfo> faceInfoListGray = new ArrayList<>();
        // IR人臉檢查
        faceEngine.detectFaces(imageInfoGray.getImageData(),
                imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray);

        configuration = new FunctionConfiguration();
        configuration.setSupportIRLiveness(true);
        faceEngine.processIr(imageInfoGray.getImageData(),
                imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray, configuration);

        //IR活體檢測(cè)
        List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();
        faceEngine.getLivenessIr(irLivenessInfo);
        LOGGER.info("IR活體:{}", irLivenessInfo.get(0).getLiveness());
    }

    /**
     * 人臉屬性檢測(cè)
     * @param faceEngine 引擎
     * @param imageInfo 圖片信息
     */
    private void getFaceAttributesEx(FaceEngine faceEngine, ImageInfo imageInfo) {
        // 人臉檢測(cè)
        List<FaceInfo> faceInfoList = new ArrayList<>();
        faceEngine.detectFaces(imageInfo.getImageData(),
                imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);

        ImageInfoEx imageInfoEx = new ImageInfoEx();
        imageInfoEx.setHeight(imageInfo.getHeight());
        imageInfoEx.setWidth(imageInfo.getWidth());
        imageInfoEx.setImageFormat(imageInfo.getImageFormat());
        imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});
        imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});

        //人臉屬性檢測(cè)
        FunctionConfiguration configuration = new FunctionConfiguration();
        configuration.setSupportGender(true);
        configuration.setSupportAge(true);
        configuration.setSupportFace3dAngle(true);
        faceEngine.process(imageInfoEx, faceInfoList, configuration);

        //性別檢測(cè)
        List<GenderInfo> genderInfoList = new ArrayList<>();
        faceEngine.getGender(genderInfoList);
        LOGGER.info("性別:{}", genderInfoList.get(0).getGender());

        //年齡檢測(cè)
        List<AgeInfo> ageInfoList = new ArrayList<>();
        faceEngine.getAge(ageInfoList);
        LOGGER.info("年齡:{}", ageInfoList.get(0).getAge());

        //3D信息檢測(cè)
        List<Face3DAngle> face3DAngleList = new ArrayList<>();
        faceEngine.getFace3DAngle(face3DAngleList);
        Face3DAngle face3DAngle = face3DAngleList.get(0);
        LOGGER.info("3D角度:{}", face3DAngle.getPitch() + "," + face3DAngle.getRoll() + "," + face3DAngle.getYaw());
    }

    /**
     * 人臉屬性檢測(cè)
     * @param faceEngine 引擎
     * @param imageInfo 圖片信息
     */
    private void getFaceAttributes(FaceEngine faceEngine, ImageInfo imageInfo) {
        //人臉屬性檢測(cè)
        FunctionConfiguration configuration = new FunctionConfiguration();
        configuration.setSupportGender(true);
        configuration.setSupportAge(true);
        configuration.setSupportFace3dAngle(true);

        // 人臉檢測(cè)
        List<FaceInfo> faceInfoList = new ArrayList<>();
        faceEngine.detectFaces(imageInfo.getImageData(),
                imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);

        faceEngine.process(imageInfo.getImageData(),
                imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);

        //性別檢測(cè)
        List<GenderInfo> genderInfoList = new ArrayList<>();
        faceEngine.getGender(genderInfoList);
        LOGGER.info("性別:{}", genderInfoList.get(0).getGender());

        //年齡檢測(cè)
        List<AgeInfo> ageInfoList = new ArrayList<>();
        faceEngine.getAge(ageInfoList);
        LOGGER.info("年齡:{}", ageInfoList.get(0).getAge());

        //3D信息檢測(cè)
        List<Face3DAngle> face3DAngleList = new ArrayList<>();
        faceEngine.getFace3DAngle(face3DAngleList);
        Face3DAngle face3DAngle = face3DAngleList.get(0);
        LOGGER.info("3D角度:{}", face3DAngle.getPitch() + "," + face3DAngle.getRoll() + "," + face3DAngle.getYaw());
    }

    /**
     * 特征比對(duì)-可設(shè)置比對(duì)模型
     * @param faceEngine 引擎
     * @param sourceFaceFeature 原特征值
     * @param targetFaceFeature 比對(duì)的特征值
     * @param compareModel 比對(duì)模型
     * @return 比對(duì)結(jié)果
     */
    private FaceSimilar compareFaceFeature(FaceEngine faceEngine, FaceFeature sourceFaceFeature, FaceFeature targetFaceFeature, CompareModel compareModel) {
        // 特征比對(duì)
        FaceSimilar faceSimilar = new FaceSimilar();
        int errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, compareModel, faceSimilar);
        if (ErrorInfo.MOK.getValue() != errorCode) {
            LOGGER.error("人臉特征比對(duì)失敗");
        }

        return faceSimilar;
    }

    /**
     * 特征比對(duì)
     * @param faceEngine 引擎
     * @param sourceFaceFeature 原特征值
     * @param targetFaceFeature 比對(duì)的特征值
     * @return 比對(duì)結(jié)果
     */
    private FaceSimilar compareFaceFeature(FaceEngine faceEngine, FaceFeature sourceFaceFeature, FaceFeature targetFaceFeature) {
        // 特征比對(duì)
        FaceSimilar faceSimilar = new FaceSimilar();
        int errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
        if (ErrorInfo.MOK.getValue() != errorCode) {
            LOGGER.error("人臉特征比對(duì)失敗");
        }

        return faceSimilar;
    }

    /**
     * 人臉檢測(cè)&特征提取--可設(shè)置檢測(cè)模式
     * @param faceEngine 引擎
     * @param imageInfo 圖片信息
     * @param detectModel 檢測(cè)模式
     * @return 人臉信息
     */
    private List<FaceDetailInfo> detectFacesEx(FaceEngine faceEngine, ImageInfo imageInfo, DetectModel detectModel) {
        ImageInfoEx imageInfoEx = new ImageInfoEx();
        imageInfoEx.setHeight(imageInfo.getHeight());
        imageInfoEx.setWidth(imageInfo.getWidth());
        imageInfoEx.setImageFormat(imageInfo.getImageFormat());
        imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});
        imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});

        List<FaceInfo> faceInfoList = new ArrayList<>();
        faceEngine.detectFaces(imageInfoEx, detectModel, faceInfoList);

        List<FaceDetailInfo> faceDetailInfoList = new ArrayList<>(faceInfoList.size());
        for (FaceInfo faceInfo : faceInfoList) {
            LOGGER.info("imageInfoEx 人臉檢測(cè)結(jié)果: {}", faceInfo);
            FaceFeature faceFeature = new FaceFeature();
            faceEngine.extractFaceFeature(imageInfoEx, faceInfo, faceFeature);

            LOGGER.info("imageInfoEx 特征值大?。簕}", faceFeature.getFeatureData().length);

            FaceDetailInfo faceDetailInfo = new FaceDetailInfo(faceInfo, faceFeature);
            faceDetailInfoList.add(faceDetailInfo);
        }

        return faceDetailInfoList;
    }

    /**
     * 人臉檢測(cè)&特征提取
     * @param faceEngine 引擎
     * @param imageInfo 圖片信息
     * @return 人臉信息
     */
    private List<FaceDetailInfo> detectFaces(FaceEngine faceEngine, ImageInfo imageInfo) {
        // 人臉檢測(cè)
        List<FaceInfo> faceInfoList = new ArrayList<>();
        faceEngine.detectFaces(imageInfo.getImageData(),
                imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);

        List<FaceDetailInfo> faceDetailInfoList = new ArrayList<>(faceInfoList.size());
        // 特征提取
        for (FaceInfo faceInfo : faceInfoList) {
            LOGGER.info("人臉檢測(cè)結(jié)果: {}", faceInfo);

            FaceFeature faceFeature = new FaceFeature();
            faceEngine.extractFaceFeature(imageInfo.getImageData(),
                    imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfo, faceFeature);

            LOGGER.info("特征值大?。簕}", faceFeature.getFeatureData().length);

            FaceDetailInfo faceDetailInfo = new FaceDetailInfo(faceInfo, faceFeature);
            faceDetailInfoList.add(faceDetailInfo);
        }

        return faceDetailInfoList;
    }

    /**
     * 初始化識(shí)別引擎
     * @param faceEngine 人臉識(shí)別引擎
     * @param functionConfiguration 功能配置
     */
    private void initEngine(FaceEngine faceEngine, FunctionConfiguration functionConfiguration) {
        // 引擎配置
        EngineConfiguration engineConfiguration = new EngineConfiguration();
        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
        engineConfiguration.setDetectFaceMaxNum(10);
        engineConfiguration.setDetectFaceScaleVal(16);

        engineConfiguration.setFunctionConfiguration(functionConfiguration);

        // 初始化引擎
        int errorCode = faceEngine.init(engineConfiguration);
        if (errorCode != ErrorInfo.MOK.getValue()) {
            throw new CustomException("初始化引擎失敗");
        }
    }

    /**
     * 識(shí)別功能配置
     */
    private FunctionConfiguration getFunctionConfiguration() {
        // 功能配置
        FunctionConfiguration functionConfiguration = new FunctionConfiguration();

        functionConfiguration.setSupportAge(true);
        functionConfiguration.setSupportFace3dAngle(true);
        functionConfiguration.setSupportFaceDetect(true);
        functionConfiguration.setSupportFaceRecognition(true);
        functionConfiguration.setSupportGender(true);
        functionConfiguration.setSupportLiveness(true);
        functionConfiguration.setSupportIRLiveness(true);

        return functionConfiguration;
    }

    /**
     * 激活 初次使用SDK時(shí)需要對(duì)SDK先進(jìn)行激活,激活后無需重復(fù)調(diào)用;調(diào)用此接口時(shí)必須為聯(lián)網(wǎng)狀態(tài),激活成功后即可離線使用;
     * @return FaceEngine 對(duì)象
     */
    private FaceEngine active() {
        URL resource = ClassLoader.getSystemResource(ARC_FACE_PATH);
        LOGGER.info("軟件安裝目錄:{}", resource);

        FaceEngine faceEngine = new FaceEngine(resource.getPath());

        ActiveFileInfo activeFileInfo = new ActiveFileInfo();
        int errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
        if (errorCode != ErrorInfo.MOK.getValue()
                && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            LOGGER.info("獲取激活文件信息失敗");
        }

        // 首次激活
        errorCode = faceEngine.activeOnline(APP_ID, SDK_KEY);
        if (errorCode != ErrorInfo.MOK.getValue()
                && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            throw new CustomException("引擎激活失敗");
        }

        LOGGER.info("激活信息:{}", activeFileInfo);

        return faceEngine;
    }

    /**
     * 卸載引擎
     * @param faceEngine 人臉識(shí)別引擎
     */
    private void unInit(FaceEngine faceEngine) {
        faceEngine.unInit();
    }
}

性能信息(參考官方文檔)

在這里插入圖片描述

閥值設(shè)置推薦(參考官方文檔)

  1. 活體取值范圍為[0~1],推薦閾值如下,高于此閾值的即可判斷為活體。
    - RGB 活體:0.5
    - IR 活體:0.7

  2. 人臉比對(duì)取值范圍為[0~1],推薦閾值如下,高于此閾值的即可判斷為同一人。
    - 用于生活照之間的特征比對(duì),推薦閾值0.80
    - 用于證件照或生活照與證件照之間的特征比對(duì),推薦閾值0.82

產(chǎn)品文檔 https://ai.arcsoft.com.cn/manual/docs#/89

 到此這篇關(guān)于Java基于虹軟實(shí)現(xiàn)人臉識(shí)別、人臉比對(duì)、活性檢測(cè)等的文章就介紹到這了,更多相關(guān)Java 人臉識(shí)別、人臉比對(duì)、活性檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Struts2的配置 struts.xml Action詳解

    Struts2的配置 struts.xml Action詳解

    這篇文章主要介紹了Struts2的配置 struts.xml Action詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java遞歸算法遍歷部門代碼示例

    Java遞歸算法遍歷部門代碼示例

    這篇文章主要介紹了Java遞歸算法遍歷部門代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Junit springboot打印測(cè)試方法信息

    Junit springboot打印測(cè)試方法信息

    這篇文章主要介紹了Junit springboot打印測(cè)試方法信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析

    Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析

    這篇文章主要為大家介紹了Java中的NoClassDefFoundError含義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-11-11
  • 在Java編程中使用正則表達(dá)式的基本方法

    在Java編程中使用正則表達(dá)式的基本方法

    這篇文章主要介紹了在Java編程中使用正則表達(dá)式的基本方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • 解決StringBuffer和StringBuilder的擴(kuò)容問題

    解決StringBuffer和StringBuilder的擴(kuò)容問題

    這篇文章主要介紹了解決StringBuffer和StringBuilder的擴(kuò)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Mybatis Update操作返回值問題

    Mybatis Update操作返回值問題

    在獲取update操作的返回值時(shí)遇到了一個(gè)問題,似乎 Mybatis 進(jìn)行 update 操作得到的 int 返回值并不是影響的行數(shù),下面通過本文給大家分享Mybatis Update操作返回值問題,需要的朋友參考下吧
    2017-09-09
  • Mybatis返回單個(gè)實(shí)體或者返回List的實(shí)現(xiàn)

    Mybatis返回單個(gè)實(shí)體或者返回List的實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis返回單個(gè)實(shí)體或者返回List的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring中的編程式事務(wù)和聲明式事務(wù)

    Spring中的編程式事務(wù)和聲明式事務(wù)

    Spring框架中,事務(wù)管理可以通過編程式事務(wù)和聲明式事務(wù)兩種方式實(shí)現(xiàn),編程式事務(wù)通過手動(dòng)編碼控制事務(wù)的開始、提交和回滾,允許開發(fā)者精確控制事務(wù),但增加了代碼復(fù)雜度,聲明式事務(wù)則通過@EnableTransactionManagement注解啟用事務(wù)管理
    2024-11-11
  • SpringBoot中對(duì)應(yīng)2.0.x版本的Redis配置詳解

    SpringBoot中對(duì)應(yīng)2.0.x版本的Redis配置詳解

    這篇文章主要為大家介紹了SpringBoot中對(duì)應(yīng)2.0.x版本的Redis配置詳解,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴們可以了解一下
    2022-06-06

最新評(píng)論

新泰市| 中方县| 沧州市| 揭阳市| 邳州市| 府谷县| 错那县| 包头市| 庄浪县| 湟源县| 宁陕县| 舞阳县| 梅河口市| 怀安县| 稷山县| 延庆县| 长武县| 陇川县| 宁明县| 呼伦贝尔市| 台北市| 博白县| 新昌县| 宣威市| 衢州市| 潜山县| 沁水县| 晋宁县| 南江县| 中西区| 泰宁县| 定边县| 河南省| 札达县| 无棣县| 象州县| 永顺县| 罗定市| 永年县| 焦作市| 迁西县|