Ajouter une annotation personnalisée à l'échelle mondiale

Cela fait longtemps que j'ai écrit un blog. J'ai récemment cherché du code que j'ai écrit auparavant, mais je ne sais pas ce que j'ai écrit dans ce projet. Je ne le trouve plus. Je dois repartir de zéro. Alors enregistrez le processus d'écriture et vérifiez-le moi-même. Un ami qui a besoin d'une référence!

Le projet est construit par springboot2.0 + mybatisplus + mysql

Condition: rédiger une note pour enregistrer l'enregistrement d'opération du compte de connexion, enregistrer principalement les opérations d'ajout, de suppression et de modification

Résultats comme indiqué ci-dessous

1. Ajoutez d'abord une annotation personnalisée, @interface, l' élément de type d'annotation ( paramètre) doit être ajouté dans l'annotation spécifique, il peut y avoir de nombreux types tels que chaîne, int, tableau, etc. Notez qu'il existe les exigences suivantes pour les paramètres:

* Le modificateur d'accès doit être public, s'il n'est pas écrit, la valeur par défaut est public;

* Le nom est généralement défini comme un nom. S'il n'y a qu'un seul élément dans le commentaire, veuillez utiliser le nom comme valeur (l'utilisation ultérieure apportera plus de commodité)

* defaultReprésente la valeur par défaut comme ceci: int age () default 18;

* S'il n'y a pas de valeur par défaut, cela signifie que vous devez attribuer une valeur à l'élément type lorsque vous utiliserez l'annotation ultérieurement

* Toutes les annotations définies hériteront automatiquement de l'interface java.lang.annotation.Annotation

L'annotation @Target est spécifiquement utilisée pour limiter les éléments Java auxquels une annotation personnalisée peut être appliquée. Il utilise un type énuméré défini comme suit:

public enum ElementType {
    /** 类,接口(包括注解类型)或枚举的声明 */
    TYPE,

    /** 属性的声明 */
    FIELD,

    /** 方法的声明 */
    METHOD,

    /** 方法形式参数声明 */
    PARAMETER,

    /** 构造方法的声明 */
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注解类型声明 */
    ANNOTATION_TYPE,

    /** 包的声明 */
    PACKAGE
}

Annotation @Retention, traduite par endurance et rétention. Il est utilisé pour modifier la vitalité des annotations personnalisées.
Le cycle de vie de l'annotation comporte trois étapes: 1. Étape du fichier source Java SOURCE, 2. Compilé au niveau du fichier de classe CLASS, 3. Étape d'exécution RUNTIME.

Le code spécifique est le suivant:

package com.zdxf.server.component.security.oplog.annotation;

import com.zdxf.server.component.security.oplog.service.impl.OperationLogAnnotation;

import javax.validation.Constraint;
import java.lang.annotation.*;

/**
 * 操作日志注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
// 可以出现在java文档中
@Documented
// 可以被子注解继承
@Inherited
public @interface AddOperationLog {

    /**
     * 功能
     * @return
     */
    String resource() default "";

    /**
     * 操作
     * @return
     */
    String operation() default "";

    /**
     * 模块
     * @return
     */
    String module() default "";
}

2. Ajoutez ensuite un intercepteur à ressort pour intercepter toutes les requêtes, ou vous pouvez spécifier la méthode pour y injecter du dao, sinon il rapportera un pointeur nul

package com.zdxf.server.component.security.oplog.config;

import com.zdxf.server.component.security.oplog.dao.IOperationLogDao;
import com.zdxf.server.component.security.oplog.service.impl.OperationLogAnnotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AnnotationConfig implements WebMvcConfigurer {
    @Autowired
    private IOperationLogDao dao;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        OperationLogAnnotation oper=new OperationLogAnnotation(dao);
        registry.addInterceptor(oper)
                .addPathPatterns("/**");
    }
}

3. Enregistrer les informations de connexion du compte

package com.zdxf.server.component.security.oplog.service.impl;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zdxf.server.common.base.context.RequestContext;
import com.zdxf.server.common.base.model.UserPriciple;
import com.zdxf.server.component.common.util.SecurityUserUtil;
import com.zdxf.server.component.govern.model.TplUserT;
import com.zdxf.server.component.security.oplog.annotation.AddOperationLog;
import com.zdxf.server.component.security.oplog.dao.IOperationLogDao;
import com.zdxf.server.component.security.oplog.model.OperationLogVO;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Date;

@Aspect
@Component
public class OperationLogAnnotation implements HandlerInterceptor {

    private IOperationLogDao dao;
    public OperationLogAnnotation(IOperationLogDao dao){
        this.dao=dao;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        boolean isAnn=handler.getClass().isAssignableFrom(HandlerMethod.class);

        if(isAnn) {
            //根据当前方法获取类的注解
            AddOperationLog olog=((HandlerMethod)handler).getMethodAnnotation(AddOperationLog.class);
            if(null!=olog){
                OperationLogVO op=createOperationLog(olog);
                int result=dao.insert(op);
                System.out.println("保存操作记录:"+result);
            }
        }
    }

    private OperationLogVO createOperationLog(AddOperationLog operationLog) {
        String moduleStr = operationLog.module();
        String resourceStr = operationLog.resource();
        String operationStr = operationLog.operation();
        OperationLogVO opLog = new OperationLogVO();

        UserPriciple user = RequestContext.getCurrent().getUser();
        if(null != user){
            opLog.setUserId(RequestContext.getCurrent().getUser().getId());
            opLog.setUsername(RequestContext.getCurrent().getUser().getUsername());
            opLog.setPhone(RequestContext.getCurrent().getUser().getPhone());
        }

        TplUserT tuser= SecurityUserUtil.obtainUser();
        if(null != tuser){
            opLog.setUserId(SecurityUserUtil.obtainUser().getAgencyUserId());
            opLog.setUsername(SecurityUserUtil.obtainUser().getUsername());
            opLog.setPhone(SecurityUserUtil.obtainUser().getPhone());
        }

        opLog.setOpDate(new Date());
        opLog.setIp(RequestContext.getCurrent().getRequest().getRemoteAddr());
        //    opLog.setLocalIp(RequestContext.getCurrent().getRequest().getLocalAddr());
        opLog.setModule(moduleStr);
        opLog.setResource(resourceStr);
        opLog.setOperation(operationStr);
//        opLog.setCreationDate(new Date());
        opLog.setOpCode("操作成功");
        return opLog;
    }

}

4. Couche Dao correspondante, utilisez la méthode par défaut de mybatis

package com.zdxf.server.component.security.oplog.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zdxf.server.component.security.oplog.model.OperationLogVO;

public interface IOperationLogDao extends BaseMapper<OperationLogVO> {
}

5. Pour l'entité correspondante, ajoutez l'annotation @Data, qui peut remplacer la méthode getset, et vous pouvez demander des détails par vous-même.

package com.zdxf.server.component.security.oplog.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tpl_operation_log_t")
@ApiModel(value="操作日志对象", description="")
public class OperationLogVO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "ID(操作日志)")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "用户ID")
    private Long userId;

    @ApiModelProperty(value = "操作结果")
    private String opCode;

    @ApiModelProperty(value = "手机")
    private String phone;

    @ApiModelProperty(value = "姓名")
    private String username;

    @ApiModelProperty(value = "角色")
    private String role;

    @ApiModelProperty(value = "IP")
    private String ip;

    @ApiModelProperty(value = "操作日期")
    private Date opDate;

    @ApiModelProperty(value = "模块")
    private String module;

    @ApiModelProperty(value = "资源")
    private String resource;

    @ApiModelProperty(value = "操作")
    private String operation;

    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date creationDate;
}

6 Pour des applications spécifiques, le nom est le nom de l'annotation personnalisée et les paramètres à l'intérieur sont les trois paramètres de l'annotation personnalisée

ce qui précède! ! !

Je suppose que tu aimes

Origine blog.csdn.net/Amos_liu/article/details/108792383
conseillé
Classement