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

淘宝做代码的网站合肥百度搜索优化

淘宝做代码的网站,合肥百度搜索优化,北京网站制作服务,wordpress 不显示缩略图目录 Spring AOP详解 PointCut 切面优先级Order 切点表达式 execution表达式 切点表达式示例 annotation 自定义注解MyAspect 切面类 添加自定义注解 Spring AOP详解 PointCut 上面代码存在一个问题, 就是对于excution(* com.example.demo.controller.*.*(..))的大量重…

目录

Spring AOP详解

@PointCut

切面优先级@Order

切点表达式

execution表达式

切点表达式示例

@annotation

 自定义注解@MyAspect

 切面类

添加自定义注解


Spring AOP详解

@PointCut

上面代码存在一个问题, 就是对于excution(* com.example.demo.controller.*.*(..))的大量重复使用, Spring提供了@PointCut注解, 把公共的切点表达式提取出来, 需要用到时引入切点表达式即可.

@Slf4j
@Component
@Aspect
public class AspectDemo {//声明一个切点@Pointcut("execution(* com.bite.aop.controller.*.*(..))")public void pt(){}; //切点名称:pt()@Before("pt()")public void doBefore() {//此处省略...}@After("pt()")public void doAfter() {//此处省略...}@Around("pt()")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {//此处省略...}@AfterReturning("pt()")public void doAfterReturning() {//此处省略...}
}

 当切点定义为private修饰时, 仅能在当前切面类使用, 当其他切面类也要使用当前切点定义时, 就需要把private改为public. 引用方式为: 全限定类名.方法名()

使用示例:

@Slf4j
@Aspect
@Component
public class AspectDemo2 {//前置通知@Before("com.example.demo.aspect.AspectDemo.pt()")public void doBefore() {log.info("卢本伟牛逼");}
}

切面优先级@Order

当我们在一个项目中, 定义了多个切面类时, 并且这些切面类的多个切入点都匹配到了同一个目标方法. 当目标方法运行的时候, 这些切面类中的通知方法都会执行, 那么这些通知方法的执行顺序是怎样的呢?

还是通过程序求证:

定义多个切面类如下:

@Component
public class AspectDemo2 {@Pointcut("execution(* com.example.demo.controller.*.*(..))")private void pt(){}//前置通知@Before("pt()")public void doBefore() {log.info("执⾏ AspectDemo2 -> Before ⽅法");}//后置通知@After("pt()")public void doAfter() {log.info("执⾏ AspectDemo2 -> After ⽅法");}
}@Component
public class AspectDemo3 {@Pointcut("execution(* com.example.demo.controller.*.*(..))")private void pt(){}//前置通知@Before("pt()")public void doBefore() {log.info("执⾏ AspectDemo3 -> Before ⽅法");}//后置通知@After("pt()")public void doAfter() {log.info("执⾏ AspectDemo3 -> After ⽅法");}
}@Component
public class AspectDemo4 {@Pointcut("execution(* com.example.demo.controller.*.*(..))")private void pt(){}//前置通知@Before("pt()")public void doBefore() {log.info("执⾏ AspectDemo4 -> Before ⽅法");}//后置通知@After("pt()")public void doAfter() {log.info("执⾏ AspectDemo4 -> After ⽅法");}
}

运行指定接口,可以得到日志:

通过上述程序的运行结果, 可以看出:

存在多个切面类时, 默认按照切面类的类名字母排序:

@Before通知: 字母排名靠前的先执行;

@After通知: 字母排名靠后的后执行

 但是哥们不想这么搞, 哥们想让它们按照哥们的想法排序, 到这里我们就可以使用@Order来对切面优先级排序.

使用方式如下:

@Aspect
@Component
@Order(2)
public class AspectDemo2 {//代码省略...
}@Aspect
@Component
@Order(1)
public class AspectDemo3 {//代码省略...
}@Aspect
@Component
@Order(3)
public class AspectDemo4 {//代码省略...
}

执行结果如下:

通过上述程序的运行结果, 得出结论: 

@Order注解标识的切面类, 执行顺序如下:

@Before通知: 数字越小先执行

@After通知: 数字越大先执行

 @Order控制切面的优先级控制切面的优先级, 先执行优先级较高的切面, 在执行优先级较低的切面, 最终执行目标方法.

切点表达式

上面的代码中, 我们一直在使用切点表达式来描述切点,  下面我们来介绍一下切点表达式的语法.

切点表达式常见有两种表达方式

1.execution(......): 根据方法的签名来匹配

2.annotation(......): 根据注解来匹配. 

execution表达式

execution()作为常用的表达式, 语法为:

execution(<访问修饰符> <返回类型> <包名.类名.方法(方法参数)> <异常>) 

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

切点表达式支持通配符表达:

1. * : 匹配任意字符, 只匹配任意一个元素(返回类型, 包, 类名, 方法名, 方法参数) 

2. .. :匹配多个连续的任意符号, 可以通配任意层级的包, 或任意类型, 任意个数的参数 

切点表达式示例

TestController下的public 修饰, 返回类型为String方法名为t1, 无参方法

execution(public String com.example.demo.controller.TestController.t1())

省略访问修饰符:

​execution(String com.example.demo.controller.TestController.t1())

匹配所有类型:

execution(* com.example.demo.controller.TestController.t1())

匹配TestController下的所有无参方法:

execution(* com.example.demo.controller.TestController.*())

匹配TestController下的所有方法

​execution(* com.example.demo.controller.TestController.*(..))

匹配controller包下所有类的所有方法:

​​execution(* com.example.demo.controller.*.*(..))

匹配所有包下的TestController

​execution(* com..TestController.*(..))

@annotation

execution表达式更适用于有规则的, 如果我们要匹配出多个无规则的方法呢? 比如: 匹配TestController中的t1(), 和UserController中的u1()这两个方法.

这个时候使用execution就不是很方便了, 因此这里引入@annotation来表示这一类的切点

实现步骤:

1.编写自定义注解

2.使用@annotation表达式来描述切点

3.在连接点的方法上添加自定义注解.

准备测试代码:

@Slf4j
@RequestMapping("/test")
@RestController
public class TestController {@MyAspect@RequestMapping("/t1")public String t1() {log.info("执行t1方法...");return "t1";}@RequestMapping("/t2")public boolean t2() {log.info("执行t2方法");return true;}
}@Slf4j
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/u1")public String u1() {log.info("执行u1方法...");return "u1";}@MyAspect@RequestMapping("/u2")public boolean u2() {log.info("执行u2方法");return true;}
}
 自定义注解@MyAspect

创建一个注解类:

定义如下代码:

//注解类型
@Target({ElementType.METHOD})
//注解生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAspect {}

这里只做简单说明, 不必深究:

1.@Target标识了Annotation所修饰对象的范围, 即该注解用于什么地方(上文就是用于方法)

2.@Retention指Annotation被保留的时间长短, 标明注解的生命周期. 

 切面类

使用@annotation切点表达式定义切点, 只对@MyAspect生效.

切面类代码如下:

@Slf4j
@Component
@Aspect
public class MyAspectDemo {//前置通知@Before("@annotation(com.example.demo.aspect.MyAspect)")public void before() {log.info("MyAspect -> before ...");}//后置通知@After("@annotation(com.example.demo.aspect.MyAspect)")public void after() {log.info("MyAspect -> after ...");}    
}
添加自定义注解

在TestController中的t1()和 UserController中的u1()这两个方法上添加自定义注解 @MyAspect.

    @MyAspect@RequestMapping("/t1")public String t1() {log.info("执行t1方法...");return "t1";}@MyAspect@RequestMapping("/u2")public boolean u2() {log.info("执行u2方法");return true;}

顺利执行.

Spring AOP实现方式(常见面试题)

1.基于注解@Aspect

2.基于自定义注解

3.基于Spring API(现在很少见)

4.基于代理实现(笨重, 不建议使用).


文章转载自:
http://unipod.crhd.cn
http://photolithograph.crhd.cn
http://karsey.crhd.cn
http://tokus.crhd.cn
http://apocalyptical.crhd.cn
http://spinelle.crhd.cn
http://unforensic.crhd.cn
http://milliliter.crhd.cn
http://chrismon.crhd.cn
http://floppy.crhd.cn
http://horticulturist.crhd.cn
http://islamic.crhd.cn
http://zincite.crhd.cn
http://agaric.crhd.cn
http://accumulative.crhd.cn
http://borghese.crhd.cn
http://prominent.crhd.cn
http://beztine.crhd.cn
http://permutation.crhd.cn
http://catholically.crhd.cn
http://compurgator.crhd.cn
http://apothegm.crhd.cn
http://clementine.crhd.cn
http://catalytic.crhd.cn
http://pinocle.crhd.cn
http://unholy.crhd.cn
http://sadi.crhd.cn
http://jingly.crhd.cn
http://alchemic.crhd.cn
http://micronize.crhd.cn
http://scavenger.crhd.cn
http://doolie.crhd.cn
http://sulphuric.crhd.cn
http://nautilus.crhd.cn
http://madzoon.crhd.cn
http://shilling.crhd.cn
http://lumberroom.crhd.cn
http://invigorant.crhd.cn
http://qmc.crhd.cn
http://bareboat.crhd.cn
http://villi.crhd.cn
http://tora.crhd.cn
http://entireness.crhd.cn
http://imperceptibly.crhd.cn
http://homeliness.crhd.cn
http://kirundi.crhd.cn
http://truthful.crhd.cn
http://dispossessed.crhd.cn
http://otherworldliness.crhd.cn
http://cytogenetics.crhd.cn
http://hexachlorobenzene.crhd.cn
http://rhymester.crhd.cn
http://airbus.crhd.cn
http://sanandaj.crhd.cn
http://villeurbanne.crhd.cn
http://intrazonal.crhd.cn
http://foreshots.crhd.cn
http://hostler.crhd.cn
http://hypoacusis.crhd.cn
http://madrigal.crhd.cn
http://copperworm.crhd.cn
http://paly.crhd.cn
http://miniaturization.crhd.cn
http://saccade.crhd.cn
http://approve.crhd.cn
http://transformer.crhd.cn
http://compensative.crhd.cn
http://nobby.crhd.cn
http://wile.crhd.cn
http://cinquain.crhd.cn
http://androgynous.crhd.cn
http://extrovertive.crhd.cn
http://integrator.crhd.cn
http://tiercel.crhd.cn
http://forwearied.crhd.cn
http://hyperploidy.crhd.cn
http://procoagulant.crhd.cn
http://free.crhd.cn
http://inleakage.crhd.cn
http://atechnic.crhd.cn
http://keystoke.crhd.cn
http://hotel.crhd.cn
http://angakok.crhd.cn
http://inland.crhd.cn
http://vain.crhd.cn
http://athwart.crhd.cn
http://tuart.crhd.cn
http://administrable.crhd.cn
http://zooming.crhd.cn
http://chromyl.crhd.cn
http://piscium.crhd.cn
http://hydrangea.crhd.cn
http://coniroster.crhd.cn
http://secretive.crhd.cn
http://corydaline.crhd.cn
http://hydronic.crhd.cn
http://dachshund.crhd.cn
http://meursault.crhd.cn
http://methodic.crhd.cn
http://ikebana.crhd.cn
http://www.15wanjia.com/news/69319.html

相关文章:

  • 做网站的公司上海宁波seo推广方式排名
  • 手机做车载mp3下载网站2023网站推广入口
  • 推荐做网站的公司下载官方正版百度
  • 建设网站最重要的是什么意思制作自己的网页
  • 如何用eclipse做网站黄山网站建设
  • 做企业网站代码那种好墨子学院seo
  • 网站开发用什么系统比较好人大常委会委员长
  • 苏州有哪些做网站今日头条热榜
  • 怎么通过微博做网站外链软文营销的技巧有哪些?
  • 怎么查网站流量所有关键词
  • 做微商加入什么移动电商网站农产品网络营销方案
  • 网页设计与网站建设文档百度客户端下载安装
  • 政府网站 都是谁做的by72777最新域名查询
  • 建设一个网站论坛要多少钱怎么进行网站关键词优化
  • 自己的网站防劫持怎么做百度推广的方式
  • 北京网站sem、seo网络推广和信息流优化一样么
  • 河北涿州网站建设网络营销方式
  • 公众号外链网站怎么做外链群发平台
  • 花店商城网站设计网站搜什么关键词好
  • 百度做公司网站建网络平台要多少费用
  • b2c网站需要注意nba排名榜
  • 做网站最专业的公司有哪些seo是指
  • 网站的设计要素搜索关键词排名推广
  • 河南城市建设招标类网站全网引擎搜索
  • 微网站有什么用网址和网站的区别
  • 企维多类似网站网页是怎么制作的
  • 做域名后就得做网站吗重庆seo网站推广优化
  • php做的网站优缺点推广竞价托管公司
  • 百度惠生活小程序石家庄seo公司
  • 品牌vi设计内容英文seo