ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring基础知识03

2022-02-02 13:33:32  阅读:164  来源: 互联网

标签:03 service Spring MyCalculator 基础知识 Integer execution com public


提示:这本文入门使用


文章目录


前言


提示:以下是本篇文章正文内容,下面案例可供参考

SpringAOP详解

动态代理的2种实现:jdk,cglib
其中若有接口,优先用jdk,反之cglib。
{早期cglib更快,但是随着jdk慢慢迭代发展,其实速度差不多}

切入点表达式;
最精确的匹配方式:
@AfterReturning(“execution(public Integer com.mashibing.service.MyCalculator. add(Integer, Integer))”)
在实际的生产环境中,更多的时候使用通配符的方式

// *
1.可以用来匹配一个或者多个字符
@AfterReturning(“execution(public Integer com.mashibing.service.MyCalculator. *(Integer, Integer))”)
2、匹配任意类型的参数
@AfterReturning(“execution(public Integer com.mashibing.service.MyCalculator. *(Integer, *))”)
3.在进行匹配的时候只能匹配一层路径,不能匹配多层
4.不能够匹配访问修饰符,如果不确定访问修饰符是什么,可以直接省略不写
execution( Integer com.mashibing. service.MyCalculator.*(Integer; *))
5、返回值可以使用此来代替

// . .(两点)
1、可以匹配多个参数,任意类型
execution(public Integer com.mashibing.service.MyCalculator.(. .)
2.可以匹配多层路径
execution (* com. mashibins. MyCalculator*.*(. .))

最偷懒的方式:
如果表达式是以开头,那么可以代替所有
@Before(“execution( * com. . * (. .))”)(com. *不行)
execution ( * * (…))
&&:多个条件必须同时满足
execution(public Integer com.mashibing.service.MyCalculator.
(…)) && execution( * * (…) )
||:多个条件只要满足其中一个即可
execution (public Integer com.mashibing. service. MyCalculator.*(…))||execution (**(…))
!:取反,除了这种情况的其他都满足
! execution(public Integer com.mashibing. service.MyCalculator.add(Integer, Integer))
使用通配符的时候不是越简洁越好,更多是要选择符合要求或者符合规则的匹配方式,此时就要求在定义标识符的时候必须要遵循项目规范

try {
start
code
return
}catch(){
exception
} finally{
end
}

通知的正常执行顺序:
如果正常执行:@Before–》@After----》@AfterReturning
如果异常结束:@Before–》@After----》@AfterThrowing

使用joinpoint获取信息
如果想要在方法中获取对应的参数或者方法名称等信息的时候,必须要使用IoinPoint对象,并且此参数必须是第一个

public void start(JoinPoint joinPoint)
//获取方法签名
Signature signature = joinPoint.getSignature() ;
//获取参数信息
0bject[] args = joinPoint.getArgs() ;

  • 如果方法中有返回值,那么必须要在注解中添加Returing=result",这个result必须要和参数列表中的参数名称保持一致
  • 如果需要添加异常信息,那么在注解中要添加Throwing="e”这个e的名称必须跟参数列表中的名称保持一致

@AfterReturning(value = "execution( public Integer com.mashibing. service.MyCalculator.*(Integer, Integer)) ,returning=“result”)
public static void 1ogException(JoinPoint joinPoint,Object result)

如果想要添加其他参数,必须要添加args(参数列表),ArgNames(参数列表)

  • 通知方法在定义的时候有没有什么特殊的要求?
    通知方法在定义的时候对于访问修饰符、返回值类型都没有明确的要求,但是要注意,参数不能随便添加

也可以抽象表达式:

@Pointcut("execution(public Integer com.mashibing.service.MyCalculator.*(Integer, Integer)))
public void myPointCut()
@Before(value = “myPointCut()”

如果有多个匹配的表达式相同,能否做抽象?
定义一个没有返回值的空方法,给该方法添加@PointCut注解,后续在使用的时候可以直接调用方法名称。
此处的方法只是起一个声明的作用,能够供内部的其他通知方法进行调用

@Around(“myPointCut ()”)
public void around (ProceedingJoinPoint pjp){
Signature sisnature = pjp. getSignature() ;
Object[] args = pjp.getArgs() ;
0bject xesult = null;
result=pjp. proceed(args) ;

环绕通知:
环绕通知在执行的时候是优先于普通通知的如果是正常结束,那么执行顺序是:
环绕前置通知–》CBefore–》环绕后置通知–》环绕返回通知–》@After–》@AfterReturning
如果是异常结束,那么执行顺序是:
环绕前置通知–》@Before–》环绕异常通知–》环绕返回通知–》@After–》OAfterReturning
如果出现异常的时候,在环绕通知中解决了,那么普通通知是接受不到的,如果想让普通通知接收到需要进行抛出
环绕前置通知–》@Before–》环绕异常通知–》环绕返回通知–》@After–》OAfterThrowing

  • @Oreder

当应用程序中包含多个切面类的时候,具体的执行顺序是什么样?
按照切面类的名称的首字母进行排序操作,按照字典序
如果需要认为的规定顺序,可以在切面类上添加@Order注解同时可以添加具体E值越小,越优先性

标签:03,service,Spring,MyCalculator,基础知识,Integer,execution,com,public
来源: https://blog.csdn.net/RUST_911/article/details/122767883

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有