4
2
0
2

Spring的AOP案例

1、自定义注解

@Documented //javadoc
@Retention(RetentionPolicy.RUNTIME) //哪里起作用
@Target(ElementType.METHOD) //放在哪些地方
public @interface DefaultParams {

}

2、必须存在的三个注解

  • @Documented:java文档
  • @Retention:在什么时候起作用
  • @Target:目标,指放在什么地方

3、案例

3.1 切面类

自定义一个注解,在添加和修改的controller方法上标注,使用Spring AOP思想,进行自动切入 (创建者、创建时间、修改者、修改时间)

import com.ydl.context.BaseContextHandler;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.time.LocalDateTime;

/**
 * 通过切面方式,自定义注解,实现实体基础数据的注入(创建者、创建时间、修改者、修改时间)
 */
@Component //交给spring
@Aspect
@Slf4j
public class DefaultParamsAspect {
    @SneakyThrows
    @Before("@annotation(com.ydl.sms.annotation.DefaultParams)")
    public void beforeEvent(JoinPoint point) {

        // TODO 自动注入基础属性(创建者、创建时间、修改者、修改时间)

        // 1. 通过方法参数的实体类,有没有 id 判断,是新增还是修改
        // threadLocal 中 获取userId
        // BaseContextHandler 该类在下方 书写了
        Long userId = BaseContextHandler.getUserId();

        // 拿当前方法的参数
        Object[] args = point.getArgs();
        // obj 当前参数对象
        for (Object obj : args) {
            Class<?> classes = obj.getClass();  // 拿到参数对象的类型
            // 获取方法
            Method method = getMethod(classes, "getId");
            Object id = null;
            if (method != null) {
                id = method.invoke(obj);
            }


            // 1.1 新增 -> 创建人 创建时间 修改人 修改时间
            if (id == null) {
                // 创建人
                method = getMethod(classes,"setCreateUser", String.class);  // 拿到设置创建人的方法
                if (method != null) {
                    method.invoke(obj, userId.toString());
                }

                // 创建时间
                method = getMethod(classes, "setCreateTime", LocalDateTime.class);
                if (method != null) {
                    method.invoke(obj, LocalDateTime.now());
                }

            }

            // 1.2 修改 -> 修改人 修改时间
            // 修改人
            method = getMethod(classes,"setUpdateUser", String.class);  // 拿到设置创建人的方法
            if (method != null) {
                method.invoke(obj, userId.toString());
            }

            // 修改时间
            method = getMethod(classes, "setUpdateTime", LocalDateTime.class);
            if (method != null) {
                method.invoke(obj, LocalDateTime.now());
            }
        }

    }

    /**
     * 获得方法对象
     * @param classes
     * @param name 方法名
     * @param types 参数类型
     * @return
     */
    private Method getMethod(Class classes, String name, Class... types) {
        try {
            return classes.getMethod(name, types);
        } catch (NoSuchMethodException e) {
            return null;
        }
    }
}

3.2 BaseContextHandler类

import com.ydl.utils.NumberHelper;  // 下面书写了对应代码
import com.ydl.utils.StrHelper; // 下面书写了对应代码
import java.util.HashMap;
import java.util.Map;

public class BaseContextHandler {
  private static final ThreadLocal<Map<String, String>> THREAD_LOCAL = new ThreadLocal<>();
  
  public static void set(String key, Long value) {
    Map<String, String> map = getLocalMap();
    map.put(key, (value == null) ? "0" : String.valueOf(value));
  }
  
  public static void set(String key, String value) {
    Map<String, String> map = getLocalMap();
    map.put(key, (value == null) ? "" : value);
  }
  
  public static void set(String key, Boolean value) {
    Map<String, String> map = getLocalMap();
    map.put(key, (value == null) ? "false" : value.toString());
  }
  
  public static Map<String, String> getLocalMap() {
    Map<String, String> map = THREAD_LOCAL.get();
    if (map == null) {
      map = new HashMap<>(10);
      THREAD_LOCAL.set(map);
    } 
    return map;
  }
  
  public static void setLocalMap(Map<String, String> threadLocalMap) {
    THREAD_LOCAL.set(threadLocalMap);
  }
  
  public static String get(String key) {
    Map<String, String> map = getLocalMap();
    return map.getOrDefault(key, "");
  }
  
  public static Long getUserId() {
    Object value = get("userid");
    return NumberHelper.longValueOf0(value);
  }
  
  public static void setUserId(Long userId) {
    set("userid", userId);
  }
  
  public static void setUserId(String userId) {
    setUserId(NumberHelper.longValueOf0(userId));
  }
  
  public static String getAccount() {
    Object value = get("account");
    return returnObjectValue(value);
  }
  
  public static void setAccount(String name) {
    set("account", name);
  }
  
  public static String getName() {
    Object value = get("name");
    return returnObjectValue(value);
  }
  
  public static void setName(String account) {
    set("name", account);
  }
  
  public static String getToken() {
    Object value = get("token");
    return StrHelper.getObjectValue(value);
  }
  
  public static void setToken(String token) {
    set("token", token);
  }
  
  public static Long getOrgId() {
    Object value = get("orgid");
    return NumberHelper.longValueOf0(value);
  }
  
  public static void setOrgId(String val) {
    set("orgid", val);
  }
  
  public static Long getStationId() {
    Object value = get("stationid");
    return NumberHelper.longValueOf0(value);
  }
  
  public static void setStationId(String val) {
    set("stationid", val);
  }
  
  public static String getDatabase() {
    Object value = get("database_name");
    return StrHelper.getObjectValue(value);
  }
  
  public static void setDatabase(String val) {
    set("database_name", val);
  }
  
  private static String returnObjectValue(Object value) {
    return (value == null) ? "" : value.toString();
  }
  
  public static void remove() {
    if (THREAD_LOCAL != null)
      THREAD_LOCAL.remove(); 
  }
}

1、NumberHelper类

import java.util.function.Function;

public class NumberHelper {
  private static <T, R> R valueOfDef(T t, Function<T, R> function, R def) {
    try {
      return function.apply(t);
    } catch (Exception e) {
      return def;
    } 
  }
  
  public static Long longValueOfNil(String value) {
    return valueOfDef(value, val -> Long.valueOf(val), null);
  }
  
  public static Long longValueOf0(String value) {
    return valueOfDef(value, val -> Long.valueOf(val), Long.valueOf(0L));
  }
  
  public static Long longValueOfNil(Object value) {
    return valueOfDef(value, val -> Long.valueOf(val.toString()), null);
  }
  
  public static Long longValueOf0(Object value) {
    return valueOfDef(value, val -> Long.valueOf(val.toString()), Long.valueOf(0L));
  }
  
  public static Boolean boolValueOf0(Object value) {
    return valueOfDef(value, val -> Boolean.valueOf(val.toString()), Boolean.valueOf(false));
  }
  
  public static Integer intValueOfNil(String value) {
    return valueOfDef(value, val -> Integer.valueOf(val), null);
  }
  
  public static Integer intValueOf0(String value) {
    return intValueOf(value, Integer.valueOf(0));
  }
  
  public static Integer intValueOf(String value, Integer def) {
    return valueOfDef(value, val -> Integer.valueOf(val), def);
  }
  
  public static Integer intValueOfNil(Object value) {
    return valueOfDef(value, val -> Integer.valueOf(val.toString()), null);
  }
  
  public static Integer intValueOf0(Object value) {
    return valueOfDef(value, val -> Integer.valueOf(val.toString()), Integer.valueOf(0));
  }
  
  public static Integer getOrDef(Integer val, Integer def) {
    return (val == null) ? def : val;
  }
  
  public static Long getOrDef(Long val, Long def) {
    return (val == null) ? def : val;
  }
  
  public static Boolean getOrDef(Boolean val, Boolean def) {
    return (val == null) ? def : val;
  }
}

2、 StrHelper 类

import cn.hutool.core.util.StrUtil;
import java.net.URLDecoder;
import java.net.URLEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class StrHelper {
  private static final Logger log = LoggerFactory.getLogger(StrHelper.class);
  
  public static String getObjectValue(Object obj) {
    return (obj == null) ? "" : obj.toString();
  }
  
  public static String encode(String value) {
    try {
      return URLEncoder.encode(value, "utf-8");
    } catch (Exception e) {
      return "";
    } 
  }
  
  public static String decode(String value) {
    try {
      return URLDecoder.decode(value, "utf-8");
    } catch (Exception e) {
      return "";
    } 
  }
  
  public static String getOrDef(String val, String def) {
    return StrUtil.isEmpty(val) ? def : val;
  }
}
posted @   CoderTL  阅读(150)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示