当前位置: 首页 > news >正文

前端做网站使用的软件工具广告联盟接广告

前端做网站使用的软件工具,广告联盟接广告,供求信息网站开发背景,临淄网站制作首选专家AOP切面编程的最佳应用场景 记录日志性能监控事务管理处理异常数据验证,验证传入参数的正确性(一般不用这个方法做,而是用拦截器) spring提供了以下注解供开发者使用,编写AOP程序 Aspect 申明切面Pointcut 切点&#…

AOP切面编程的最佳应用场景

  • 记录日志
  • 性能监控
  • 事务管理
  • 处理异常
  • 数据验证,验证传入参数的正确性(一般不用这个方法做,而是用拦截器)

spring提供了以下注解供开发者使用,编写AOP程序

  • @Aspect 申明切面
  • @Pointcut 切点,申明AOP的作用范围(如:一个类下所有方法,某个方法,带有指定注解的方法)
  • @Before 前置通知
  • @After 后置通知
  • @Around 环绕通知
  • @AfterThrowing 异常通知,当被切入点中代码执行异常时触发

实操

举个例子

  1. 定义
    @RestController
    @RequestMapping(path = {"test"})
    public class DemoController {@GetMapping(path = {"test01/{name}"})public ResponseEntity<String> test01(@PathVariable("name") String name) {return new ResponseEntity<>(name.toUpperCase(), HttpStatus.OK);}
    }
    
    如果我希望在上面方法使用AOP,定义一个类,实现如下
    @Slf4j
    @Aspect
    @Component
    public class AOPAction {// 定义切点,标记此切点在什么范围内此切面起作用@Pointcut("execution(* com.train.controller.DemoController.test02(..))")public void pointcut() {}//前置通知@Before(value = "pointcut()")public void before(JoinPoint joinPoint) {log.info("Before Method : {}...{}", joinPoint.getSignature().getName(), args[0].toString());}// 后置通知@After(value = "pointcut()")public void after(JoinPoint joinPoint) {log.info("After Method : {}...{}", joinPoint.getSignature().getName(), args[0].toString());}// 环绕通知@Around(value = "pointcut()")public Object around1(ProceedingJoinPoint joinPoint) throws Throwable {log.info("Around 1 Method before: {}...", joinPoint.getSignature().getName());Object result = joinPoint.proceed();log.info("Around 1 Method after: {}...", joinPoint.getSignature().getName());return result;}
    }
    

切点执行范围

此章节介绍多种切点定义形式,开发中使用哪一种视情况而定

1.指定包下所有类的所有方法

应用在此包下所有类的所有方法上

// 包名:com.train.controller
@Pointcut("execution(* com.train.controller..*.*(..))")
public void pointcut() {}

2.指定类中所有方法

应用在指定类的所有方法上

// 全类名:com.train.controller.DemoController
@Pointcut("execution(* com.train.controller.DemoController.*(..))")
public void pointcut() {}

3.指定某个类中某个方法

应用在指定类的指定方法上,而此类中的其他方法不会被应用

// 全类名:com.train.controller.DemoController
@Pointcut("execution(* com.train.controller.DemoController.test01(..))")
public void pointcut() {}

4.1 按参数数量指定

AOP切入点表达式规范中,用*表示一个参数,用表示无固定个数参数

可以这么理解:把*理解成通配符,且仅匹配一个。

// 仅作用在com.train.controller包下所有类中仅有2个参数的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(*,*))")
public void pointcut02(){}
// 仅作用在com.train.controller包下所有类中仅有5个参数的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(*,*,*,*,*))")
public void pointcut02(){}

4.2 按参数注解指定

⚠️ 研究中,未完成


5.加有指定注解的方法

仅应用在使用了注解的方法上,可以使用自定义注解,也可以使用框架提供注解。此形式最灵活,推荐开发中使用

// 自定义注解
public @interface LogPointCut {}
// 加注解的方法
@GetMapping(path = {"test/{name}"})
@LogPointCut
public ResponseEntity<String> test(@PathVariable("name") String name) {return new ResponseEntity<>(name.toUpperCase(), HttpStatus.OK);
}
// 定义
@Pointcut("@annotation(com.train.annotation.LogPointCut)")
public void pointcut() {
}

6.组合条件【难点】

使用A符合 Spring AOP 的切入点表达式规范组合多个条件,组合条件最好用&&连接各个条件。用+匹配接口。用*匹配一个。用匹配无固定数

举例

// 仅作用在com.train.controller包下所有类中所有标记了@LogPointCut注解的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(..)) && @annotation(com.train.spr.annotation.LogPointCut)")
public void pointcut02(){}
// 仅作用在com.train.spr.controller包下所有实现了MyInterface接口的类的方法上
@Pointcut(value = "execution(* (com.train.controller..* && com.train.spr.interfaces.MyInterface+).*(..))")
public void pointcut02(){}// 仅作用在com.train.spr.controller包下所有实现了MyInterface接口和MyInterface2接口的类的方法上
@Pointcut(value = "execution(* (com.train.controller..* " +"&& com.train.spr.interfaces.MyInterface+ " +"&& com.train.spr.interfaces.MyInterface2+ ).*(..))")
public void pointcut02(){}

当然!也可以组合多个已定义的条件作为一个条件,例如

import org.aspectj.lang.annotation.Pointcut;// 仅作用在com.train.spr.controller包下类的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(..))")
public void pointcut01() {}// 仅作用在实现了MyInterface接口的类的方法上
@Pointcut(value = "execution(* com.train.spr.interfaces.MyInterface+.*(..))")
public void pointcut02() {}// 组合上述两个切入点的条件
@Pointcut(value = "pointcut02() && pointcut01()")
public void pointcut03() {}

AOP切入点表达式规范请查阅官网

获取参数

AOP的方法可以获取被切入方法的参数,但是修改这些参数并不会在被切入方法中生效。举个例子,方法A有一个前置通知方法B,且方法B获取方法A的参数,即便方法B中修改了参数值,方法A获取到的参数仍然不会改变,原来是怎样就是怎样

获取参数这块注意3点就够了。

  1. 前置通知/后置通知的参数是org.aspectj.lang.JoinPoint
  2. 环绕通知的参数是org.aspectj.lang.ProceedingJoinPoint
  3. 被切入点的参数信息都被封装到JoinPointProceedingJoinPoint中,直接从中获取即可【注意类型】

特殊的切入方法——异常通知

研究中,未完成

http://www.hkea.cn/news/246920/

相关文章:

  • 什么人最需要建设网站淘宝运营一般要学多久
  • 海南网站优化东莞免费建站公司
  • 传播型网站建设优势有哪些推广类软文
  • 如何在百度做网站推广赚钱的软件
  • c# 网站开发教程周口网站seo
  • 湘西网站建设帮人推广注册app的平台
  • 切图做网站web制作网站的模板
  • 网站的做网站公司哪家好网络优化大师app
  • 国内外包网站今日头条(官方版本)
  • 外网建筑设计网站线上渠道推广有哪些方式
  • 厦门做网站公司排名电工培训机构
  • 武汉网站设计制作外包公司的人好跳槽吗
  • 网站建设哪里最好页面关键词优化
  • 清远建设网站制作seo系统培训课程
  • 网站的网页建设知识ppt北大青鸟职业技术学院简介
  • 巫山网站设计aso优化榜单
  • 关于节约化建设网站的表态发言网站制作报价表
  • 建行网站是多少呢故事式的软文广告例子
  • 阳江市住房和城乡规划建设局网站一级消防工程师考试
  • 做课件的网站有哪些用html制作淘宝网页
  • 网站开发前后台整个流程品牌宣传的推广
  • 深圳市门户网站建设网站推广优化方法
  • 中山公司注册网页怎么优化
  • 网站建设怎么分录2022年新闻摘抄简短
  • 江西景德镇建设厅网站太原关键词排名推广
  • 番禺做网站自媒体发布平台有哪些
  • 用dede做的网站首页电子商务网络营销
  • 最好的做任务赚钱网站网络域名怎么查
  • 建设部规范网站百度app关键词优化
  • 骏域网站百度怎么收录网站