最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在@Value注解內(nèi)使用SPEL自定義函數(shù)方式

 更新時間:2022年02月17日 10:53:41   作者:daijiguo  
這篇文章主要介紹了在@Value注解內(nèi)使用SPEL自定義函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@Value注解內(nèi)使用SPEL自定義函數(shù)

@Value("#{T(com.cheetah.provider.utils.StringUtil).lower('${cluster.vendor.type}')}")

其中,${cluster.vendor.type}取的application.properties中的配置,com.cheetah.provider.utils.StringUtil#lower是用戶自定義函數(shù),

T()運算符的結果是一Class對象,它的真正價值在于它能夠訪問目標類型的靜態(tài)方法和常量

自定義注解支持SpEL表達式

利用AOP生成用戶操作日志

1.定義日志注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
? ? //普通的操作說明
? ? String value() default "";
? ??
? ? //spel表達式的操作說明
? ? String spelValue() default "";
}

2.定義spel解析工具類

public class SpelUtil {
? ? /**
? ? ?* 用于SpEL表達式解析.
? ? ?*/
? ? private static SpelExpressionParser parser = new SpelExpressionParser();
? ? /**
? ? ?* 用于獲取方法參數(shù)定義名字.
? ? ?*/
? ? private static DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
? ? public static String generateKeyBySpEL(String spELString, ProceedingJoinPoint joinPoint) {
? ? ? ? // 通過joinPoint獲取被注解方法
? ? ? ? MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
? ? ? ? Method method = methodSignature.getMethod();
? ? ? ? // 使用spring的DefaultParameterNameDiscoverer獲取方法形參名數(shù)組
? ? ? ? String[] paramNames = nameDiscoverer.getParameterNames(method);
? ? ? ? // 解析過后的Spring表達式對象
? ? ? ? Expression expression = parser.parseExpression(spELString);
? ? ? ? // spring的表達式上下文對象
? ? ? ? EvaluationContext context = new StandardEvaluationContext();
? ? ? ? // 通過joinPoint獲取被注解方法的形參
? ? ? ? Object[] args = joinPoint.getArgs();
? ? ? ? // 給上下文賦值
? ? ? ? for (int i = 0; i < args.length; i++) {
? ? ? ? ? ? context.setVariable(paramNames[i], args[i]);
? ? ? ? }
? ? ? ? // 表達式從上下文中計算出實際參數(shù)值
? ? ? ? /*如:
? ? ? ? ? ? @annotation(key="#student.name")
? ? ? ? ? ? ?method(Student student)
? ? ? ? ? ? ?那么就可以解析出方法形參的某屬性值,return “xiaoming”;
? ? ? ? ? */
? ? ? ? return expression.getValue(context).toString();
? ? }
}

3.定義切面類

@Aspect
@Component
public class SysLogAspect {
? ? @Autowired
? ? private LogService logService;
? ? @Autowired
? ? private HttpServletRequest request;
? ? @Pointcut("@annotation(com.ztri.common.annotation.SysLog)")
? ? public void logPointCut() {
? ? }
? ? @Around("logPointCut()")
? ? public Object around(ProceedingJoinPoint point) throws Throwable {
? ? ? ? long beginTime = System.currentTimeMillis();
? ? ? ? //執(zhí)行方法
? ? ? ? Object result = point.proceed();
? ? ? ? //執(zhí)行時長(毫秒)
? ? ? ? long time = System.currentTimeMillis() - beginTime;
? ? ? ? //保存日志
? ? ? ? saveSysLog(point, time);
? ? ? ? return result;
? ? }
? ? private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
? ? ? ? MethodSignature signature = (MethodSignature) joinPoint.getSignature();
? ? ? ? Method method = signature.getMethod();
? ? ? ? Log sysLog = new Log();
? ? ? ? sysLog.setTime(time);
? ? ? ? SysLog syslog = method.getAnnotation(SysLog.class);
? ? ? ? if (syslog != null) {
? ? ? ? ? ? //注解上的描述
? ? ? ? ? ? if (StrUtil.isNotBlank(syslog.value())) {
? ? ? ? ? ? ? ? sysLog.setOperation(syslog.value());
? ? ? ? ? ? }
? ? ? ? ? ? if (StrUtil.isNotBlank(syslog.spelValue())) {
? ? ? ? ? ? ? ? String spelValue = SpelUtil.generateKeyBySpEL(syslog.spelValue(), joinPoint);
? ? ? ? ? ? ? ? sysLog.setOperation(spelValue);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //請求的方法名
? ? ? ? String className = joinPoint.getTarget().getClass().getName();
? ? ? ? String methodName = signature.getName();
? ? ? ? sysLog.setMethod(className + "." + methodName + "()");
? ? ? ? //請求的參數(shù)
? ? ? ? Object[] args = joinPoint.getArgs();
? ? ? ? try {
? ? ? ? ? ? String params = JSONUtil.toJsonStr(args);
? ? ? ? ? ? sysLog.setParams(params);
? ? ? ? } catch (Exception e) {
? ? ? ? }
? ? ? ? //設置IP地址
? ? ? ? sysLog.setIp(ServletUtil.getClientIP(request));
? ? ? ? UserAgent ua = UserAgentUtil.parse(request.getHeader("User-Agent"));
? ? ? ? sysLog.setBrowser(ua.getBrowser().toString());
? ? ? ? //保存系統(tǒng)日志
? ? ? ? logService.create(sysLog);
? ? }
}

4.方法上使用日志注解

? ? @ApiOperation("高級搜索(包含點擊1.熱門列表 2.更多跳轉頁面)")
? ? @PostMapping("searchData")
? ? @SysLog(spelValue = "'高級搜索' + #searchVo.keyWord")
? ? public ResponseEntity<Object> searchData(@RequestBody SearchVo searchVo) throws IOException {
? ? ? ? SearchDto searchDto = searchService.searchData(searchVo);
? ? ? ? return new ResponseEntity<>(searchDto, HttpStatus.OK);
? ? }
? ? @ApiOperation("登錄授權")
? ? @PostMapping("/login")
? ? @SysLog("用戶登錄")
? ? public ResponseEntity<Object> login(@Validated(User.Create.class) @RequestBody LoginUser loginUser) {
? ? ? ? return ResponseEntity.ok(authInfo);
? ? }

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • mybatis如何實現(xiàn)繼承映射

    mybatis如何實現(xiàn)繼承映射

    這篇文章主要介紹了mybatis如何實現(xiàn)繼承映射的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring Cache原理解析

    Spring Cache原理解析

    Spring Cache是一個框架,它提供了基于注解的緩存功能,使得開發(fā)者可以很方便地將緩存集成到他們的應用程序中,這篇文章主要介紹了Spring Cache原理解析,需要的朋友可以參考下
    2024-05-05
  • java中創(chuàng)建兩表之間的觸發(fā)器詳解

    java中創(chuàng)建兩表之間的觸發(fā)器詳解

    這篇文章主要介紹了java中創(chuàng)建兩表之間的觸發(fā)器詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-06-06
  • java使用Dijkstra算法實現(xiàn)單源最短路徑

    java使用Dijkstra算法實現(xiàn)單源最短路徑

    這篇文章主要為大家詳細介紹了java使用Dijkstra算法實現(xiàn)單源最短路徑,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列

    java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列

    大家都知道LinkedBlockingQueue 隊列是BlockingQueue接口的實現(xiàn)類,所以它具有BlockingQueue接口的一切功能特點,他還提供了兩種構造函數(shù),本文中通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-06-06
  • SpringBoot和Springfox(Swagger)版本不兼容的解決方案

    SpringBoot和Springfox(Swagger)版本不兼容的解決方案

    documentationPluginsBootstrapper這個 bean 無法正常啟動,原因是遇到了空指針異常(NullPointerException),這通常是由于 Spring Boot 和 Springfox 的版本不兼容導致的路徑匹配策略沖突,本文給大家介紹了SpringBoot和Springfox(Swagger)版本不兼容的解決方案
    2024-12-12
  • 詳解Java中類與對象的關系

    詳解Java中類與對象的關系

    這篇文章主要介紹了詳解Java中類與對象的關系,類的關鍵字是class,在Java編程里,類的作用相當于機械師手中的構造圖,如果沒有構造圖,就無法打造武器,同樣如果沒有類,就無法實例化,需要的朋友可以參考下
    2023-05-05
  • 實例講解Java基礎之反射

    實例講解Java基礎之反射

    今天小編就為大家分享一篇關于實例講解Java基礎之反射,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java?讀寫鎖的使用及它的優(yōu)點

    java?讀寫鎖的使用及它的優(yōu)點

    這篇文章主要介紹了java?讀寫鎖的使用及它的優(yōu)點,讀寫鎖的特點就是是讀讀不互斥、讀寫互斥、寫寫互斥,下面具體使用分享需要的小伙伴可以參考一下
    2022-05-05
  • Mybatis?ResultMap和分頁操作示例詳解

    Mybatis?ResultMap和分頁操作示例詳解

    這篇文章主要為大家介紹了Mybatis?ResultMap和分頁操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10

最新評論

成武县| 比如县| 泰兴市| 长宁区| 三亚市| 岑巩县| 博野县| 招远市| 荣成市| 德兴市| 康平县| 邯郸市| 丽江市| 封丘县| 奉节县| 扬中市| 邯郸县| 西畴县| 璧山县| 和林格尔县| 凤庆县| 宣威市| 云和县| 娄烦县| 门头沟区| 桑日县| 中方县| 大连市| 遵义市| 新绛县| 柳江县| 且末县| 九台市| 和田市| 正镶白旗| 涿鹿县| 香格里拉县| 达尔| 兴安县| 明星| 大城县|