Springboot自定義注解&傳參&簡單應(yīng)用方式
Springboot自定義注解&傳參&簡單應(yīng)用
1、目錄結(jié)構(gòu)
1.1 annotation為自定義注解位置


2、自定義注解
2.1 自定義兩個注解LogController、TimeConsuming用來記錄日志和統(tǒng)計方法耗時,其中LogController有三個參數(shù)

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogController {
// 具體操作
String description();
// 日志級別
int logLevel() default LogLevelConstant.INFO;
// 日志進程/方法名
String method();
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TimeConsuming {
}3、注解使用
3.1 在需要記錄日志和統(tǒng)計方法耗時的方法上使用注解
@PostMapping("/createUser")
@LogController(description = "創(chuàng)建用戶", method = "/createUser")
@TimeConsuming
public ResponseEntity<ResponseResultVO> createUser(@Valid @RequestBody SysUsersVo sysUsersVo) {
log.info("UserManager = start create user [{}] pwd [{}]", sysUsersVo.getUserName(), sysUsersVo.getUserPwd());
return ResponseEntity.ok(usersService.createUser(sysUsersVo).orElse(ResponseResultVO.builder()
.code(ErrorCodeConstant.SYSTEM_ERROR)
.msg(ErrorMsgConstant.SYSTEM_ERROR)
.build()));
}4、使用Aspect實現(xiàn)功能
4.1 通過Aop以注解作為切點切入方法,實現(xiàn)業(yè)務(wù)功能

@Pointcut("@annotation(com.pet.annotation.LogController)")
public void annotationPoint() {
}
@Pointcut("@annotation(com.pet.annotation.TimeConsuming)")
public void methodTimePoint() {
}4.2 取注解中參數(shù)
比如下面方法實現(xiàn)記錄日志功能
@Before(value = "annotationPoint() && @annotation(logController)", argNames = "joinPoint, logController")
public void beforeController(JoinPoint joinPoint, LogController logController) {
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
HttpSession session = request.getSession();
SysUsers user = (SysUsers) session.getAttribute(HttpConstant.SESSION_USER);
String realMethodName = joinPoint.getSignature().getName();
log.info("Aspect = [{}] ,user [{}] , method [{}] , logLevel [{}] , do [{}] , realMethod [{}]",
new Date(), user == null ? "system" : user.getUserName(), logController.method(), logController.logLevel(), logController.description(), realMethodName);
// 異步處理日志
publisher.publishEvent(new LogToDbEvent(
LogToDbEventEntity.builder()
.date(new Date())
.userName(user == null ? "system" : user.getUserName())
.method(logController.method())
.logLevel(logController.logLevel())
.description(logController.description())
.realMethod(realMethodName)
.build()));
}統(tǒng)計方法耗時方法
@Around(value = "methodTimePoint()")
public Object apiTimeConsuming(ProceedingJoinPoint pjp) throws Throwable {
long begin = System.currentTimeMillis();
String method = pjp.getSignature().getName();
String className = pjp.getTarget().getClass().getName();
Object ret = pjp.proceed();
log.info("Aspect = [{}] ,class [{}] , method [{}] , time consuming[{}]", new Date(), className, method, System.currentTimeMillis() - begin);
return ret;
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java四種拷貝方式實戰(zhàn)總結(jié)(一文掃清所有拷貝問題)
在Java中文件拷貝可以通過多種方式實現(xiàn),不同方式的性能和適用場景有所差異,文中通過代碼介紹的非常詳細(xì),這篇文章主要介紹了Java四種拷貝方式的相關(guān)資料,需要的朋友可以參考下2025-07-07
關(guān)于@Scheduled參數(shù)及cron表達式解釋
這篇文章主要介紹了關(guān)于@Scheduled參數(shù)及cron表達式解釋,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java中List與數(shù)組之間的相互轉(zhuǎn)換
在日常Java學(xué)習(xí)或項目開發(fā)中,經(jīng)常會遇到需要int[]數(shù)組和List列表相互轉(zhuǎn)換的場景,然而往往一時難以想到有哪些方法,最后可能會使用暴力逐個轉(zhuǎn)換法,往往不是我們所滿意的,下面這篇文章主要給大家介紹了關(guān)于Java中List與數(shù)組之間的相互轉(zhuǎn)換,需要的朋友可以參考下2023-05-05
解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題
這篇文章主要給大家介紹了如何解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題,文中有詳細(xì)的解決方案,有需要的朋友可以參考閱讀下2023-07-07
關(guān)于SpringMVC在Controller層方法的參數(shù)解析詳解
在SpringMVC中,控制器Controller負(fù)責(zé)處理由DispatcherServlet分發(fā)的請求,下面這篇文章主要給大家介紹了關(guān)于SpringMVC在Controller層方法的參數(shù)解析的相關(guān)資料,需要的朋友可以參考下2021-12-12

