国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

如何使用Spring AOP預(yù)處理Controller的參數(shù)

瀏覽:2日期:2023-06-26 16:28:34
Spring AOP預(yù)處理Controller的參數(shù)

實(shí)際編程中,可能會(huì)有這樣一種情況,前臺(tái)傳過來的參數(shù),我們需要一定的處理才能使用

比如有這樣一個(gè)Controller

@Controllerpublic class MatchOddsController { @Autowired private MatchOddsServcie matchOddsService; @RequestMapping(value = '/listOdds', method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseBody public List<OddsModel> listOdds(@RequestParam Date startDate, @RequestParam Date endDate) {return matchOddsService.listOdds(startDate, endDate); }}

前臺(tái)傳過來的startDate和endDate是兩個(gè)日期,實(shí)際使用中我們需要將之轉(zhuǎn)換為兩個(gè)日期對(duì)應(yīng)的當(dāng)天11點(diǎn),如果只有這么一個(gè)類的話,我們是可以直接在方法最前面處理就可以了

但是,還有下面兩個(gè)類具有同樣的業(yè)務(wù)邏輯

@Controllerpublic class MatchProductController { @Autowired private MatchProductService matchProductService; @RequestMapping(value = '/listProduct', method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE }) @ResponseBody public List<ProductModel> listProduct(@RequestParam Date startDate, @RequestParam Date endDate) {return matchProductService.listMatchProduct(startDate, endDate); }}

@Controllerpublic class MatchController { @Autowired private MatchService matchService;@RequestMapping(value = '/listMatch', method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseBody public List<MatchModel> listMatch(@RequestParam Date startDate, @RequestParam Date endDate) {return matchService.listMatch(startDate, endDate); }}

當(dāng)然也可以寫兩個(gè)util方法,分別處理startDate和endDate,但是為了讓Controller看起來更干凈一些,我們還是用AOP來實(shí)現(xiàn)吧,順便為AOP更復(fù)雜的應(yīng)用做做鋪墊

本應(yīng)用中使用Configuration Class來進(jìn)行配置,

主配置類如下:

@SpringBootApplication@EnableAspectJAutoProxy(proxyTargetClass = true) //開啟AspectJ代理,并將proxyTargetClass置為true,表示啟用cglib對(duì)Class也進(jìn)行代理public class Application extends SpringBootServletInitializer { ...}下面新建一個(gè)Aspect類,代碼如下

@Aspect //1@Configuration //2public class SearchDateAspect { @Pointcut('execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date)) && args(startDate,endDate)') //3 private void searchDatePointcut(Date startDate, Date endDate) { //4 } @Around(value = 'searchDatePointcut(startDate,endDate)', argNames = 'startDate,endDate') //5 public Object dealSearchDate(ProceedingJoinPoint joinpoint, Date startDate, Date endDate) throws Throwable { //6Object[] args = joinpoint.getArgs(); //7if (args[0] == null) { args[0] = Calendars.getTodayEleven(); args[1] = DateUtils.add(new Date(), 7, TimeUnit.DAYS);//默認(rèn)顯示今天及以后的所有賠率} else { args[0] = DateUtils.addHours(startDate, 11); args[1] = DateUtils.addHours(endDate, 11);}return joinpoint.proceed(args); //8 }}分別解釋一下上面各個(gè)地方的意思,標(biāo)號(hào)與語句之后的注釋一致 表示這是一個(gè)切面類 表示這個(gè)類是一個(gè)配置類,在ApplicationContext啟動(dòng)時(shí)會(huì)加載配置,將這個(gè)類掃描到 定義一個(gè)切點(diǎn),execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date))表示任意返回值,在com.ronnie.controller包下任意類的以list開頭的方法,方法帶有兩個(gè)Date類型的參數(shù),args(startDate,endDate)表示需要Spring傳入這兩個(gè)參數(shù) 定義切點(diǎn)的名稱 配置環(huán)繞通知 ProceedingJoinPoint會(huì)自動(dòng)傳入,用于處理真實(shí)的調(diào)用 獲取參數(shù),下面代碼是修改參數(shù) 使用修改過的參數(shù)調(diào)用目標(biāo)類

更多可參考

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

AOP獲取參數(shù)名稱

由于項(xiàng)目中打印日志的需要,研究了一下在aop中,獲取參數(shù)名稱的方法。

1、jdk1,8中比較簡(jiǎn)單,直接通過joinPoint中的getSignature()方法即可獲取

Signature signature = joinpoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; String[] strings = methodSignature.getParameterNames(); System.out.println(Arrays.toString(strings));

如何使用Spring AOP預(yù)處理Controller的參數(shù)

2.通用方法。比較麻煩

public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{ String classType = joinPoint.getTarget().getClass().getName(); Class<?> clazz = Class.forName(classType); String clazzName = clazz.getName(); String methodName = joinPoint.getSignature().getName(); //獲取方法名稱 Object[] args = joinPoint.getArgs();//參數(shù) //獲取參數(shù)名稱和值 Map<String,Object > nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,args); System.out.println(nameAndArgs.toString()); //為了省事,其他代碼就不寫了, return result = joinPoint.proceed(); }

private Map<String,Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException { Map<String,Object > map=new HashMap<String,Object>(); ClassPool pool = ClassPool.getDefault(); //ClassClassPath classPath = new ClassClassPath(this.getClass()); ClassClassPath classPath = new ClassClassPath(cls); pool.insertClassPath(classPath);CtClass cc = pool.get(clazzName); CtMethod cm = cc.getDeclaredMethod(methodName); MethodInfo methodInfo = cm.getMethodInfo(); CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); if (attr == null) {// exception } // String[] paramNames = new String[cm.getParameterTypes().length]; int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1; for (int i = 0; i < cm.getParameterTypes().length; i++){map.put( attr.variableName(i + pos),args[i]);//paramNames即參數(shù)名 } //Map<> return map;}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 成年美女黄网站色大 | 欧美性色xo在线 | 久久夜色精品国产噜噜亚洲a | 91成人啪国产啪永久地址 | 国产成人精品视频播放 | 欧美一区二区三区免费不卡 | 国产欧美另类久久精品91 | 一级特色大黄美女播放网站 | 草草草影院| 午夜大片免费男女爽爽影院久久 | 美国毛片毛片全部免费 | 亚洲国产欧美在线不卡中文 | 日韩视频欧美视频 | 综合亚洲欧美日韩一区二区 | 国产永久免费视频m3u8 | 亚洲国产欧美在线人成精品一区二区 | 高清精品女厕在线观看 | 欧美日韩日本国产 | 国产日韩不卡免费精品视频 | 久草在线播放视频 | 99久久国产综合精品1尤物 | 国产在线播放一区二区 | 国产自产自拍 | 国产日韩精品欧美一区喷 | 成年人免费小视频 | 一区免费在线观看 | 欧美一级久久 | 国产大片在线看 | 精品视频99 | 亚洲国产一区二区三区最新 | 日韩一区二区天海翼 | 美女毛片免费 | 天堂素人搭讪系列嫩模在线观看 | 国产在视频线在精品 | 美女张开腿男人桶 | 欧美一级毛片免费看视频 | 亚洲国产精品成人精品软件 | 一级国产a级a毛片无卡 | 香蕉国产人午夜视频在线观看 | 92精品国产成人观看免费 | 一级成人毛片免费观看欧美 |