AOP通过开启注解方式自动注入值


注解:EnableDimEnhance

package com.comma.teeth.enhance.dim.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 

* *

* * @author: GoslingWu * @date: 2022-03-08 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface EnableDimEnhance { boolean enable() default true; }

AOP:DimEnhanceAop

package com.comma.teeth.conf;

import com.comma.teeth.common.vo.Paging;
import com.comma.teeth.enhance.dim.annotation.EnableDimEnhance;
import com.comma.teeth.enhance.dim.service.DimEnhanceService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collection;

/**
 * 

* *

* * @author: GoslingWu * @date: 2022-03-08 */ @Data @Slf4j @Aspect @Component public class DimEnhanceAop { /** * 切点 全部service方法 */ //private static final String POINTCUT = "execution(public * com.comma.teeth.*.service.impl..*.*(..))"; @Autowired private DimEnhanceService dimEnhanceService; @Pointcut("@annotation(com.comma.teeth.enhance.dim.annotation.EnableDimEnhance)") public void dimEnhanceAspect() { } @AfterReturning(pointcut = "dimEnhanceAspect()", returning = "result") public void afterReturning(JoinPoint joinPoint, Object result) { if (result == null) { return; } // 方式1:service方法上开启自动注入 { // 获取注解 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 获取当前方法被注解注释的注解对象 EnableDimEnhance annotation = signature.getMethod().getAnnotation(EnableDimEnhance.class); if (annotation.enable()) { if (result instanceof Paging) { Paging iPage = (Paging) result; //通过反射获取指定属性上的注解,@SysDictField(code="1",valueFieldName="typeName")去自动注入 dimEnhanceService.autoFillValue(iPage.getRecords()); } else if (result instanceof Collection) { dimEnhanceService.autoFillValue((Collection) result); } else{ dimEnhanceService.autoFillValue(result); } } } // 方式2:返回实体类上开启自动注入 /*{ if (result instanceof Paging) { Paging iPage = (Paging) result; List records = iPage.getRecords(); if(CollectionUtil.isNotEmpty(records)){ Object o = records.get(0); EnableDimEnhance annotation = o.getClass().getAnnotation(EnableDimEnhance.class); if(annotation.enable()){ dimEnhanceService.autoFillValue(iPage.getRecords()); } } } else { EnableDimEnhance annotation = result.getClass().getAnnotation(EnableDimEnhance.class); if(annotation.enable()){ dimEnhanceService.autoFillValue(result); } } }*/ log.info("DimEnhanceAop-------afterReturning:{}", result); } }

SysDictField

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SysDictField {

    String code();

    /**
     * 用来指定自动填充时的字段,valueField必须是字符串类型。
     * 

* 默认为:注解所在字段名 + "Name" * * @return . */ String valueFieldName() default ""; }

@Data
@Builder
public class CounselorFollowRecordQueryVo implements Serializable{
    private static final long serialVersionUID = 1L;

    @SysDictField(code = SysDictConstant.COMMUNICATION, valueFieldName = "typeName")
    @ApiModelProperty(value = "跟进方式id")
    private Integer typeId;

    @ApiModelProperty(value = "跟进方式")
    private String typeName;
}

使用

@Override
//使用注解标识,会进入AOP,把Vo对象中的@SysDictField属性标识指定的valueFieldName名称填充进去,通过反射(sql中typeId是要查询出来的,反射只填充name)
//我们有些表中有crrentUserId,一样可以通过自定义一个@UserField来实现UserName的填充
@EnableDimEnhance
public Paging getCounselorFollowRecordPageList(CounselorFollowRecordQueryParam param) throws Exception {
    Page page = setPageParam(param, OrderItem.desc("id"));
    IPage iPage = counselorFollowRecordMapper.getCounselorFollowRecordPageList(page, param, labelSearchParam);
    return new Paging<>(iPage);
}