电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

如何使用Spring AOP預處理Controller的參數

瀏覽:3日期:2023-06-26 16:28:34
Spring AOP預處理Controller的參數

實際編程中,可能會有這樣一種情況,前臺傳過來的參數,我們需要一定的處理才能使用

比如有這樣一個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); }}

前臺傳過來的startDate和endDate是兩個日期,實際使用中我們需要將之轉換為兩個日期對應的當天11點,如果只有這么一個類的話,我們是可以直接在方法最前面處理就可以了

但是,還有下面兩個類具有同樣的業務邏輯

@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); }}

當然也可以寫兩個util方法,分別處理startDate和endDate,但是為了讓Controller看起來更干凈一些,我們還是用AOP來實現吧,順便為AOP更復雜的應用做做鋪墊

本應用中使用Configuration Class來進行配置,

主配置類如下:

@SpringBootApplication@EnableAspectJAutoProxy(proxyTargetClass = true) //開啟AspectJ代理,并將proxyTargetClass置為true,表示啟用cglib對Class也進行代理public class Application extends SpringBootServletInitializer { ...}下面新建一個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);//默認顯示今天及以后的所有賠率} else { args[0] = DateUtils.addHours(startDate, 11); args[1] = DateUtils.addHours(endDate, 11);}return joinpoint.proceed(args); //8 }}分別解釋一下上面各個地方的意思,標號與語句之后的注釋一致 表示這是一個切面類 表示這個類是一個配置類,在ApplicationContext啟動時會加載配置,將這個類掃描到 定義一個切點,execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date))表示任意返回值,在com.ronnie.controller包下任意類的以list開頭的方法,方法帶有兩個Date類型的參數,args(startDate,endDate)表示需要Spring傳入這兩個參數 定義切點的名稱 配置環繞通知 ProceedingJoinPoint會自動傳入,用于處理真實的調用 獲取參數,下面代碼是修改參數 使用修改過的參數調用目標類

更多可參考

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

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

AOP獲取參數名稱

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

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

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

如何使用Spring AOP預處理Controller的參數

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();//參數 //獲取參數名稱和值 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即參數名 } //Map<> return map;}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 地脚螺栓_材质_标准-永年县德联地脚螺栓厂家 | 物和码官网,物和码,免费一物一码数字化营销SaaS平台 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 软文发布平台 - 云软媒网络软文直编发布营销推广平台 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 517瓜水果特产网|一个专注特产好物的网站 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 江苏皓越真空设备有限公司| 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 振动传感器,检波器-威海广达勘探仪器有限公司 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 茶叶百科网-茶叶知识与茶文化探讨分享平台 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 广州网站建设_小程序开发_番禺网站建设_佛山网站建设_粤联网络 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 首页_中夏易经起名网| 泰州物流公司_泰州货运公司_泰州物流专线-东鑫物流公司 | 济南宣传册设计-画册设计_济南莫都品牌设计公司 | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 潍坊大集网-潍坊信息港-潍坊信息网 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 |