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;
}
}
本文来自博客园,作者:CoderTL,转载请注明原文链接:https://www.cnblogs.com/codertl/p/15348842.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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