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

Spring開(kāi)發(fā)中自定義注解的使用詳解

 更新時(shí)間:2024年01月23日 10:39:42   作者:小星星*  
這篇文章主要介紹了Spring開(kāi)發(fā)中自定義注解的使用詳解,在Java項(xiàng)目中,可以自定義注解,方便進(jìn)行某些處理操作,提供開(kāi)發(fā)效率,需要的朋友可以參考下

Spring自定義注解

在Java項(xiàng)目中,可以自定義注解,方便進(jìn)行某些處理操作,提供開(kāi)發(fā)效率。

比如,在進(jìn)行實(shí)體類的crud操作時(shí),一般都有create_time, createUser, updateTime, updateUser這幾個(gè)字段,而且不是核心業(yè)務(wù)代碼,這時(shí)可以引入注解簡(jiǎn)化開(kāi)發(fā)和提高效率。

比如下面這段代碼:

//實(shí)體類的新增操作
public void save(CategoryDTO categoryDTO) {
       //....................................
        //設(shè)置創(chuàng)建時(shí)間、修改時(shí)間、創(chuàng)建人、修改人
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        category.setCreateUser(BaseContext.getCurrentId());
        category.setUpdateUser(BaseContext.getCurrentId());
        categoryMapper.insert(category);
  }

如果都按照上述的操作方式來(lái)處理這些公共字段, 需要在每一個(gè)業(yè)務(wù)方法中進(jìn)行操作, 編碼相對(duì)冗余、繁瑣,那能不能對(duì)于這些公共字段在某個(gè)地方統(tǒng)一處理,來(lái)簡(jiǎn)化開(kāi)發(fā)呢?

以下以自定義注解AutoFill為例,使用AOP切面編程,實(shí)現(xiàn)功能增強(qiáng),來(lái)完成公共字段自動(dòng)填充功能。 說(shuō)明如何自定義注解,和使用注解

實(shí)現(xiàn)步驟:

  • 自定義注解 AutoFill,用于標(biāo)識(shí)需要進(jìn)行公共字段自動(dòng)填充的方法
  • 自定義切面類 AutoFillAspect,統(tǒng)一攔截加入了 AutoFill 注解的方法,通過(guò)反射為公共字段賦值
  • 在 Mapper 的方法上加入 AutoFill 注解

1. 引入maven依賴

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.4</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

2. 自定義注解

package com.zsx.annotation;
import com.zsx.enumeration.OperationType;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 自定義注解,用于標(biāo)識(shí)某個(gè)方法需要進(jìn)行功能字段自動(dòng)填充處理
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    //數(shù)據(jù)庫(kù)操作類型:UPDATE INSERT
    OperationType value();
}

枚舉類OperationType

package com.zsx.enumeration;
/**
 * 數(shù)據(jù)庫(kù)操作類型
 */
public enum OperationType {
    /**
     * 更新操作
     */
    UPDATE,
    /**
     * 插入操作
     */
    INSERT
}

3. 自定義切面

package com.zsx.aspect;
import com.zsx.annotation.AutoFill;
import com.zsx.constant.AutoFillConstant;
import com.zsx.context.BaseContext;
import com.zsx.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
/**
 * 自定義切面,實(shí)現(xiàn)公共字段自動(dòng)填充處理邏輯
 */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
    /**
     * 切入點(diǎn)
     */
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
    public void autoFillPointCut(){}
    /**
     * 前置通知,在通知中進(jìn)行公共字段的賦值
     */
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint){
        log.info("開(kāi)始進(jìn)行公共字段自動(dòng)填充...");
        //獲取到當(dāng)前被攔截的方法上的數(shù)據(jù)庫(kù)操作類型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法簽名對(duì)象
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//獲得方法上的注解對(duì)象
        OperationType operationType = autoFill.value();//獲得數(shù)據(jù)庫(kù)操作類型
        //獲取到當(dāng)前被攔截的方法的參數(shù)--實(shí)體對(duì)象
        Object[] args = joinPoint.getArgs();
        if(args == null || args.length == 0){
            return;
        }
        Object entity = args[0];
        //準(zhǔn)備賦值的數(shù)據(jù)
        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();
        //根據(jù)當(dāng)前不同的操作類型,為對(duì)應(yīng)的屬性通過(guò)反射來(lái)賦值
        if(operationType == OperationType.INSERT){
            //為4個(gè)公共字段賦值
            try {
                Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                //通過(guò)反射為對(duì)象屬性賦值
                setCreateTime.invoke(entity,now);
                setCreateUser.invoke(entity,currentId);
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else if(operationType == OperationType.UPDATE){
            //為2個(gè)公共字段賦值
            try {
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                //通過(guò)反射為對(duì)象屬性賦值
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

AutoFillConstant 常量類

package com.zsx.reggie.constant;
/**
 * 公共字段自動(dòng)填充相關(guān)常量
 */
public class AutoFillConstant {
    /**
     * 實(shí)體類中的方法名稱
     */
    public static final String SET_CREATE_TIME = "setCreateTime";
    public static final String SET_CREATE_USER = "setCreateUser";
    public static final String SET_UPDATE_TIME = "setUpdateTime";
    public static final String SET_UPDATE_USER = "setUpdateUser";
}

4. 使用注解

在Mapper接口的方法上加入 AutoFill 注解

package com.sky.mapper;
@Mapper
public interface CategoryMapper {
    /**
     * 插入數(shù)據(jù)
     * @param category
     */
    @Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +
            " VALUES" +
            " (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
    @AutoFill(value = OperationType.INSERT)
    void insert(Category category);
    /**
     * 根據(jù)id修改分類
     * @param category
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Category category);
}

完成,這樣在每次插入和更新操作的時(shí)候,就可以自動(dòng)設(shè)置更新時(shí)間和更新人id。 (不過(guò)要注意,這里的sql語(yǔ)句中的這幾個(gè)字段還是不能缺少)

到此這篇關(guān)于Spring開(kāi)發(fā)中自定義注解的使用詳解的文章就介紹到這了,更多相關(guān)Spring自定義注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis generator mapper文件覆蓋原文件的示例代碼

    Mybatis generator mapper文件覆蓋原文件的示例代碼

    這篇文章主要介紹了Mybatis generator mapper文件覆蓋原文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java 字符終端上獲取輸入三種的方式分享

    Java 字符終端上獲取輸入三種的方式分享

    這篇文章主要介紹了Java 字符終端上獲取輸入三種的方式,有需要的朋友可以參考一下
    2013-11-11
  • Java編程實(shí)現(xiàn)二項(xiàng)分布的采樣或抽樣實(shí)例代碼

    Java編程實(shí)現(xiàn)二項(xiàng)分布的采樣或抽樣實(shí)例代碼

    這篇文章主要介紹了Java編程實(shí)現(xiàn)二項(xiàng)分布的采樣或抽樣實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • SWT(JFace)體驗(yàn)之復(fù)制粘貼

    SWT(JFace)體驗(yàn)之復(fù)制粘貼

    SWT(JFace)體驗(yàn)之復(fù)制粘貼
    2009-06-06
  • java實(shí)現(xiàn)坦克大戰(zhàn)游戲

    java實(shí)現(xiàn)坦克大戰(zhàn)游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)坦克大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • SpringBoot中使用JdbcTemplate訪問(wèn)Oracle數(shù)據(jù)庫(kù)的案例詳解

    SpringBoot中使用JdbcTemplate訪問(wèn)Oracle數(shù)據(jù)庫(kù)的案例詳解

    JdbcTemplate是Spring框架中的一個(gè)核心類,用于簡(jiǎn)化Java應(yīng)用程序與關(guān)系型數(shù)據(jù)庫(kù)的交互操作,本文給大家介紹SpringBoot中使用JdbcTemplate訪問(wèn)Oracle數(shù)據(jù)庫(kù)的方法,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Mybatis執(zhí)行SQL命令的流程分析

    Mybatis執(zhí)行SQL命令的流程分析

    這篇文章主要介紹了Mybatis執(zhí)行SQL命令的流程分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java?List一些常用方法完全攻略

    Java?List一些常用方法完全攻略

    List就是一個(gè)線性表,即n個(gè)具有相同類型元素的有限序列,在該序列上可以執(zhí)行增刪改查以及變量等操作,這篇文章主要介紹了Java List一些常用方法的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • java中的前++和后++的區(qū)別示例代碼詳解

    java中的前++和后++的區(qū)別示例代碼詳解

    這篇文章主要介紹了java中的前++和后++的區(qū)別示例代碼詳解,其實(shí)大家只要記住一句話就可以了,前++是先自加再使用而后++是先使用再自加,本文通過(guò)代碼給大家詳細(xì)解說(shuō),感興趣的朋友跟隨小編一起看看吧
    2020-06-06
  • SpringBoot整合RocketMQ極速實(shí)戰(zhàn)教程

    SpringBoot整合RocketMQ極速實(shí)戰(zhàn)教程

    本文詳細(xì)介紹了SpringBoot集成RocketMQ的全過(guò)程,涵蓋普通、廣播、順序、延遲、批量、過(guò)濾、事務(wù)等多種消息模式,通過(guò)自動(dòng)裝配、全局配置、核心組件等介紹RocketMQ與SpringBoot的深入集成原理與實(shí)戰(zhàn)應(yīng)用,感興趣的朋友一起看看吧
    2026-06-06

最新評(píng)論

广宁县| 上饶市| 义乌市| 冕宁县| 增城市| 吉水县| 泽普县| 鹤壁市| 宝兴县| 阿拉善右旗| 天长市| 融水| 余姚市| 西和县| 五莲县| 麟游县| 隆回县| 陇川县| 达日县| 伊川县| 平江县| 吉安县| 西平县| 长兴县| 徐汇区| 望都县| 民勤县| 关岭| 漠河县| 探索| 南投市| 股票| 汉沽区| 昭通市| 崇明县| 新民市| 宣汉县| 唐河县| 迁安市| 永城市| 油尖旺区|