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

大连 网站制作 外贸百度官网app

大连 网站制作 外贸,百度官网app,成都专业建网站,公司网站建设费用预算1. 快速入手 AOP:就是面相切面编程,切面指的就是某一类特定的问题,也可以理解为面相特定方法编程,例如之前使用的拦截器,就是 AOP 思想的一种应用,统一数据返回格式和统一异常处理也是 AOP 思想的实现方式…

1. 快速入手

AOP:就是面相切面编程,切面指的就是某一类特定的问题,也可以理解为面相特定方法编程,例如之前使用的拦截器,就是 AOP 思想的一种应用,统一数据返回格式和统一异常处理也是 AOP 思想的实现方式

比如说需要统计每个方法执行的耗时,如果正常来写的话,需要在方法的开头和结尾来定义时间戳相减

如果有很多方法都需要计算的话,总不能每个方法都写这些重复的代码吧,接下来看通过使用 AOP 思想是如何实现的

首先需要添加对应的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后需要添加@Component注解,

@Slf4j
@Aspect
@Component
public class TimeRecordAspect {@Around("execution(* com.example.springbook.controller.*.*(..))")public Object timeRecord(ProceedingJoinPoint pjt){//记录开始时间long start = System.currentTimeMillis();//执行目标方法Object o = null;try {o = pjt.proceed();} catch (Throwable e){throw new RuntimeException(e);}log.info(pjt.getSignature() + "执行耗时:" + (System.currentTimeMillis() - start));return o;}
}

再去调用接口的话就会计算出来对应方法消耗的时间

来简单分析一下上面的代码:

2. 通知类型

Spring AOP 的通知类型有以下几种

・@Around:环绕通知,在目标方法前、后都被执行。
・@Before:前置通知,在目标方法前被执行。
・@After:后置通知,在目标方法后被执行,无论是否有异常都会执行。
・@AfterReturning:返回后通知,在目标方法后被执行,有异常不会执行。
・@AfterThrowing:异常后通知,发生异常后执行。

接下来同时测试一下这些通知类型,

来看一下接口正常返回的情况下的执行顺序

再来看接口发生异常的情况下的执行顺序:

从上面的结果上就可以看出,Around 可以完成其他类型的功能

需要注意的是:

  1. @Around 环绕通知需要调用 ProceedingJoinPoint.proceed () 来让原始方法执行,其他通知不需要考虑目标方法执行。
  2. @Around 环绕通知方法的返回值,必须指定为 Object,来接收原始方法的返回值,否则原始方法执行完毕,是获取不到返回值的。

3. @Pointcut

在上面的代码中还存在一个问题,每次写一个方法都需要写一个切点表达式,如果说更换切点的话,那么所有的切点表达式都要修改一下,就可以通过@Pointcut 注解,把公共的切点表达式提取出来,需要用到时引用该切点表达式即可

这样提取出来,其他方法想要调用直接写上方法名称即可,和定义的常量类似,那么同一个类下可以直接调用,如果是不同的类的话需要把全限定名写上,并写明是 xx 类的 xx 方法

@Around("com.example.springaop.aspect.AspectDemo.pt()")

执行之后也是生效了

但是如果定义时设置为了 private 的话其他类就不能执行了

@Pointcut("execution(* com.example.springaop.controller.*.*(..))")
private void pt(){}

4. 切面优先级

当在一个项目中定义了多个切面类时,并且这些切面类的多个切入点都匹配到了同一个目标方法,那么目标方法执行的时候,这些切面类中的通知方法都会执行,那么这时就会有一个优先级,哪个切面类先执行

通过测试发现,执行的顺序也是类似于一个切面的

关于切面类的执行顺序,默认是按照类名的字典序来执行的

可以@Order注解通过来修改优先级

这样 AspectDemo2 的优先级就变为最高的了,就先执行,也就是数字越大优先级越高

5. 切点表达式

5.1. execution 表达式

访问修饰符和异常可以省略

  1. * 表示通配符,匹配任意字符,不过只能匹配一个元素(即只能匹配任意一种返回类型,包名,类名,方法或者方法参数),一层包使用一个 *
  2. ' . . ' 表示匹配多个连续的任意符号,可以通配任意层级的包,或者任意类型,任意个数的参数,使用 .. 配置包名,表示此包以及此包下的所有子包

来看具体示例:

  1. 表示匹配 TestController 下的 public 修饰,返回类型为 String 方法名为 t1,无参方法

  1. 如果省略访问修饰符,表示匹配 public 修饰或者 protected 修饰的方法

  1. 表示匹配所有返回类型

  1. 如果再把方法名设为 * 表示所有方法,上面就是匹配该类下的所有无参方法

  1. 如果设为 .. 就表示所有方法,无论有参还是无参都能匹配

  1. 表示 controller 包下的所有类的所有方法都匹配

  1. 表示 com 下类名为 TestController 的所有方法

  1. 表示 demo 下的所有包的所有类的所有方法

5.2. @annotation

使用 execution 表达式匹配的方法都是具有一定规律的,比如 xx 包的 xx 类的 xx 方法,那么如果没有规律可循的话就需要使用 @annotation 注解了

首先,可以通过自定义注解的方式,自定义注解的创建需要选择 @Annotation

@Retention(RetentionPolicy.RUNTIME) //注解的有效阶段
@Target({ElementType.METHOD}) //表示方法注解
public @interface TimeRecord {
}

然后在原来计时的方法上来使用 @annotation 来指明要使用的注解

接下来只要是添加了自定义的注解都会执行这里的方法

通过这种方式就实现了想要给哪个方法生效就直接加上注解就可以了

除了自定义注解,其他现存的注解也是可以这样使用的

例如,可以把@RequestMapping的路径写在@annotation里,就表示只要加了@RequestMapping的方法都可以生效

http://www.shuangfujiaoyu.com/news/47057.html

相关文章:

  • 广州做网站的公司哪家好百度收录快速提交
  • 空间站做网站有什么企业宣传推广方案
  • 服装网站建设策划书下载百度网盘app
  • 增城网站建设百度推广服务
  • 政府门户型网站建设站长工具ip查询
  • 该网站使用的安全设置百度客服电话24小时人工服务热线
  • 机械营销型网站三个关键词介绍自己
  • 网站制作设计方案seo关键词
  • 虹口建设机械网站简述企业网站推广的一般策略
  • 浙江住房和城乡建设厅报名网站铁力seo
  • 公司网站怎么做网站备案天津seo招聘
  • 上海做网站的软件开发培训学校
  • 秦皇岛做网站哪家好重庆关键词快速排名
  • iis怎么做ip网站吗账户竞价托管费用
  • 免备案的网站首页建站seo推广
  • 做设计在哪个网站上找高清图片大全域名查询ip爱站网
  • 企业手机网站建设推广长沙大型网站建设公司
  • 接活做图网站广告宣传费用一般多少
  • 稳定的网站建设怎么优化网站性能
  • 域名收录提交入口seo导航
  • 网站做好了怎么做后台管理企业推广宣传文案
  • 网站排名软件下载做网络销售如何找客户
  • 个人网站备案需要什么资料seo推广网址
  • 手机微信网站怎么做seo优化培训学校
  • 建设自己的网站怎么做软文代写公司
  • asp网站镜像代码淘宝运营培训课程
  • 把自己做的动画传到哪个网站上网络推广公司简介
  • 网站开发与设计培训一份完整的营销策划方案
  • 网站建设开发价格手机seo关键词优化
  • 外贸 国外推广网站免费网站搭建平台