您的位置: 首页 - 站长

wordpress 建站教程 .pdf网络维护是做什么

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

wordpress 建站教程 .pdf,网络维护是做什么,温州市永嘉上塘建设局网站,WordPress做图床目录 1. 问题描述2. 结论结论1#xff1a;对于同一个切入点#xff0c;同一个切面不同类型的通知的执行顺序结论2#xff1a;对于同一个切入点#xff0c;不同切面不同类型通知的执行顺序 3. 测试环境#xff1a;SpringBoot 2.3.4.RELEASE测试集合… 目录 1. 问题描述2. 结论结论1对于同一个切入点同一个切面不同类型的通知的执行顺序结论2对于同一个切入点不同切面不同类型通知的执行顺序 3. 测试环境SpringBoot 2.3.4.RELEASE测试集合1针对结论1单个切面类的情况。测试1切入点正常执行完无异常。测试2切入点抛出异常测试3AfterReturning执行了注解属性returning表示需要返回值 测试集合2针对结论2多个切面类的情况 4. 参考5. 结语如果对大家有帮助请点赞支持。如果有问题随时在评论中指出感谢。 1. 问题描述 在Spring AOP中对于同一个切入点可能会有多个切面多种不同类型的通知共同作用于它那么这些来自不同切面的不同类型通知它们的执行顺序是怎样的本文将答案分成2部分讲述。 对于同一个切入点同一个切面不同类型的通知的执行顺序。对于同一个切入点不同切面不同类型通知的执行顺序。 文章后续安排section 2直接给出结论图文结合更好理解。section 3讲述测试过程。section 4讲述参考来源。大家可以根据自己需要查看相应部分想看结论可以直接看section2。

  1. 结论 结论1“对于同一个切入点同一个切面不同类型的通知的执行顺序” 图片描述 文字描述 Around(before) Before #切入点方法# AfterReturing/AfterThrowing (1. 假如有异常执行AfterThrowing。2. 假如没异常 2.1 假如AfterReturning中没有设置returning属性AfterReturning修饰的方法会被执行。 2.2 假如AfterReturning中设置了returning属性当切入点方法拥有返回值时AfterReturning修饰的方法会被执行否则不执行) After (不管有没有异常都执行) Around(after) (1. 切入点方法抛出异常而且没有捕获不执行。2. 切入点方法没有异常或者异常被捕获执行。) 结论2“对于同一个切入点不同切面不同类型通知的执行顺序” 图片描述 文字描述 切入点方法之前优先级越高的切面的通知越先被执行。 切入点方法之后优先级越高的切面的通知越后被执行。 切面优先级可以通过在切面类上的定义注解Order或者”实现Ordered接口中的getOrder()决定”值越小优先级越高。 3. 测试 环境SpringBoot 2.3.4.RELEASE 测试集合1针对结论1单个切面类的情况。 测试1切入点正常执行完无异常。 切面类各种通知都有 Component Aspect public class CommonAspect1 {Pointcut(execution(* cn.edu.szu.flow.control.service.UserService.(..)))private void pointCut() {}Around(pointCut())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println(Around(before));Object val joinPoint.proceed();System.out.println(Around(after));return val;}Before(pointCut())public void before() {System.out.println(Before);}AfterReturning(value pointCut())public void afterReturning() {System.out.println(AfterReturning);}AfterThrowing(pointCut())public void afterThrowing() {System.out.println(AfterThrowing);}After(pointCut())public void after() {System.out.println(After);} }切入点方法 Service public class UserService {public void addUser() {System.out.println(切入点方法执行……);}调用切入点方法 SpringBootApplication public class FlowControlApplication {public static void main(String[] args) {SpringApplication.run(FlowControlApplication.class, args);}Autowiredprivate UserService userService;PostConstructpublic void postConstruct() {// ————–调用切入点方法————–userService.addUser();} }结果符合结论1
    测试2切入点抛出异常 切面类和测试1相同切入点方法在测试1基础上修改让它抛出异常。 Service public class UserService {public void addUser() {System.out.println(切入点方法执行……);System.out.println(切入点方法抛出异常……);int i 10;}调用切入点方法和测试1相同结果符合结论1。AfterThrowing执行AfterReturning不执行Around没有捕获异常因此后面的不执行。
    测试3AfterReturning执行了注解属性returning表示需要返回值 切面类在测试1基础上只修改AfterReturning AfterReturning(value pointCut(), returning result) public void afterReturning(String result) {System.out.println(AfterReturning); }切入点方法不抛出异常 Service public class UserService {public void addUser() {System.out.println(切入点方法执行……);}调用切入点方法和测试1相同结果符合结论1。AfterReturning不执行因为切入点方法是void而AfterReturning指明了需要返回值。
    测试集合2针对结论2多个切面类的情况 切面1包含不同类型的通知并使用Order指明优先级。值越小优先级越高。 Order(0) Component Aspect public class CommonAspect1 {Pointcut(execution(
    cn.edu.szu.flow.control.service.UserService.(..)))private void pointCut() {}Around(pointCut())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println(Around(before).One);Object val joinPoint.proceed();System.out.println(Around(after).One);return val;}Before(pointCut())public void before() {System.out.println(Before.One);}AfterReturning(value pointCut())public void afterReturning() {System.out.println(AfterReturning.One);}AfterThrowing(pointCut())public void afterThrowing() {System.out.println(AfterThrowing.One);}After(pointCut())public void after() {System.out.println(After.One);} }切面2和切面1类似包含不同类型的通知并使用Order指明优先级。值越小优先级越高。 Order(1) Component Aspect public class CommonAspect2 {Pointcut(execution( cn.edu.szu.flow.control.service.UserService.*(..)))private void pointCut() {}Around(pointCut())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println(Around(before).Two);Object val joinPoint.proceed();System.out.println(Around(after).Two);return val;}Before(pointCut())public void before() {System.out.println(Before.Two);}AfterReturning(value pointCut())public void afterReturning() {System.out.println(AfterReturning.Two);}AfterThrowing(pointCut())public void afterThrowing() {System.out.println(AfterThrowing.Two);}After(pointCut())public void after() {System.out.println(After.Two);} }切入点方法 Service public class UserService {public void addUser() {System.out.println(切入点方法执行……);}执行切入点方法 SpringBootApplication public class FlowControlApplication {public static void main(String[] args) {SpringApplication.run(FlowControlApplication.class, args);}Autowiredprivate UserService userService;PostConstructpublic void postConstruct() {// ————–调用切入点方法————–userService.addUser();} }符合结论2在切入点方法之前优先级高的先执行。在切入点方法之后优先级高的后执行。 调换2个切面的优先级让切面2的优先级更高 结果符合结论2。在切入点方法之前优先级高的先执行。在切入点方法之后优先级高的后执行。
  2. 参考 Spring 5.3.39 docs 本文测试使用SpringBoot2.3.4.RELEASE内部使用的是Spring5.x所以这里看的也是5.x的文档(Spring6.x文档关于这部分的内容和Spring5.x是一样的)。
    参考1说在切入点方法之前优先级越高的通知越先执行。在切入点访问之后优先级越高的通知越后执行。参考2说在不同的切面中可以通过给切面类”添加Order”或者”实现Ordered接口”来指定切面的优先级从而决定不同切面中通知的优先级。如果不指定则执行顺序不可知。参考3说在同一个切面中不同类型的通知优先级由高到低分别是Around, Before, After, AfterReturning, AfterThrowing。注意结合参考1After和AfterReturning, AfterThrowing都是在切入点之后执行的优先级越高的通知越后执行因此执行顺序是AfterThrowingAfterReturningAfter。结合参考1参考3上述测试 得出结论1。结合参考1参考2上述测试 得出结论2。 同一切面内通知的执行顺序细节不多但启发了我直接去看官方文档。
  3. 结语如果对大家有帮助请点赞支持。如果有问题随时在评论中指出感谢。