注解实现(基于Spring AOP)

这篇具有很好参考价值的文章主要介绍了注解实现(基于Spring AOP)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于注解的实现

切入点

切入点表达式

Spring AOP 支持的切入点主要有以下几种:

  1. execution:用于匹配方法执行的连接点。这是最常用的切入点指示器。你可以指定具体的方法,或者类来匹配。 例如:execution(* com.example.service.*.*(..)),这个表达式表示匹配 com.example.service 包下的所有类的所有方法。

  2. within:用于匹配特定类型内的方法执行。 例如:within(com.example.service.*),这个表达式表示匹配 com.example.service 包下所有类的所有方法。

  3. this:用于匹配创建了 AOP 代理的对象的方法执行。 例如:this(com.example.service.MyService),这个表达式表示匹配实现了 com.example.service.MyService 接口的代理对象的方法。

  4. target:用于匹配目标对象的方法执行。 例如:target(com.example.service.MyService),这个表达式表示匹配实现了 com.example.service.MyService 接口的目标对象的方法。

  5. args:用于匹配方法参数。 例如:args(java.io.Serializable),这个表达式表示匹配那些接收单个参数,且参数类型是 java.io.Serializable 的方法。

  6. @target:用于匹配持有指定注解的类的所有方法。 例如:@target(org.springframework.stereotype.Service),这个表达式表示匹配所有使用 @Service 注解的类的方法。

  7. @args:用于匹配传入参数持有指定注解的方法。 例如:@args(org.springframework.validation.annotation.Validated),这个表达式表示匹配所有接收了使用 @Validated 注解的参数的方法。

  8. @within:用于匹配持有指定注解的类及其子类的所有方法。 例如:@within(org.springframework.stereotype.Service),这个表达式表示匹配所有使用 @Service 注解的类及其子类的方法。

  9. @annotation:用于匹配当前执行方法持有指定注解的方法。 例如:@annotation(org.springframework.transaction.annotation.Transactional),这个表达式表示匹配所有使用 @Transactional 注解的方法。

这些切入点定义方式在实际使用时可以相互组合,例如:execution(* com.example..*.*(..)) && @annotation(org.springframework.transaction.annotation.Transactional),这表示匹配 com.example 包及其子包下所有类中使用了 @Transactional 注解的方法。

不同的切入点有不同的适用场景,你可以根据需要选择合适的切入点表达式。例如,如果你想要针对某个特定的类或者特定的方法进行增强,那么你可能会选择使用 execution;如果你想要针对某种特定的注解进行增强,那么你可能会选择使用 @annotation。

target@target 都是 Spring AOP 提供的两种不同类型的切入点声明,它们的主要区别在于匹配对象的方式和范围。

  1. target:这种类型的切入点表达式用于匹配目标对象的方法执行。在这种情况下,Spring AOP 会检查被增强的对象(即 AOP 的目标对象)是否符合指定的类型。例如,target(com.example.service.MyService),这个表达式表示匹配所有实现了 com.example.service.MyService 接口的目标对象的方法。

  2. @target:这种类型的切入点表达式用于匹配持有指定注解的类的所有方法。Spring AOP 会检查目标对象的类是否有指定的注解。例如,@target(org.springframework.stereotype.Service),这个表达式表示匹配所有使用 @Service 注解的类的方法。

总的来说,target 是根据类(或接口)类型来匹配的,而 @target 是根据类是否标注了特定注解来匹配的。这两者可以根据具体需求来选择使用。

在Spring AOP中,主要有两种风格的切入点定义:Spring风格和AspectJ风格。

  1. Spring风格:Spring风格的切入点表达式主要使用“execution”、“args”、“@args”、“@within”、“within”、“@annotation”和“@target”等关键字,这些关键字可以定义匹配方法的规则。例如,“execution(* com.example.service.*(..))”可以匹配com.example.service包下的所有方法。

  2. AspectJ风格:AspectJ风格的切入点表达式则更为强大和灵活,它支持所有Spring风格的关键字,此外,它还支持“call”、“get”、“set”、“handler”、“preinitialization”、“staticinitialization”和“@this”等关键字。例如,“call(* com.example.service.*(..))”可以匹配对com.example.service包下的所有方法的调用。

这两种风格的切入点定义的主要区别在于支持的关键字和匹配的粒度。Spring风格主要关注于方法的执行,而AspectJ风格则更为全面,除了方法执行外,还可以匹配方法调用、字段读写等操作,因此,AspectJ风格可以提供更为细致的控制。

值得注意的是,虽然AspectJ风格更为强大,但是Spring AOP的实现仅支持部分AspectJ的切入点表达式,这是因为Spring AOP底层基于动态代理实现,部分切入点(例如“call”)在动态代理中无法实现。因此,在使用AspectJ风格时,还需要考虑Spring AOP的限制。

自定义切入点

通过Pointcut获取MethodMatcher

MethodMatcher实现matches方法

在Spring AOP中,Pointcut接口包含两个重要的组件:ClassFilterMethodMatcher

ClassFilter用于确定某个类是否应被AOP代理影响。matches(Class)方法在这个接口中定义,用于判断给定的类是否应用切面。

MethodMatcher 接口用于判断类中的哪些方法应该被AOP框架拦截。在这个接口中定义了 matches(Method, Class)isRuntime() 方法。如果isRuntime()方法返回false,那么 matches(Method, Class) 将会被调用,用来做静态的匹配检查;如果 isRuntime() 返回true,那么在静态检查通过后,还会进行一次运行时的检查,也就是调用 matches(Method, Class, Object[]) 方法。

Advisor通知

AuthorizationAttributeSourceAdvisor

它定义了切点(即哪些方法应当被拦截)以及通知Advice(即在匹配的方法上执行的动作)。

这里的Advice就是Interceptor.

拦截器

AnnotationsAuthorizingMethodInterceptor 是 Shiro 的一个类,它是一个方法拦截器,专门用来处理与授权相关的注解。这个类是 org.apache.shiro.aop.MethodInterceptor 的实现,其主要作用是在方法调用之前进行授权检查。

当一个方法被调用时,AnnotationsAuthorizingMethodInterceptor 会检查该方法是否有与授权相关的注解(如 @RequiresPermissions, @RequiresRoles, @RequiresUser, @RequiresGuest, @RequiresAuthentication 等)。如果有,它将根据这些注解进行授权检查。如果授权检查失败,它会阻止方法的调用并抛出一个异常。

AnnotationsAuthorizingMethodInterceptor 主要通过 invoke 方法来完成这项工作。在 invoke 方法中,它首先获取方法上的所有授权相关注解,然后通过调用 assertAuthorized 方法来进行授权检查。如果检查失败,assertAuthorized 方法将抛出一个 AuthorizationException 异常。如果检查成功,invoke 方法将调用下一个拦截器或者目标方法。

总的来说,AnnotationsAuthorizingMethodInterceptor 的作用是在方法调用前进行基于注解的授权检查。文章来源地址https://www.toymoban.com/news/detail-575305.html

到了这里,关于注解实现(基于Spring AOP)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring02-Spring注解的使用、基于注解的IOC、纯注解配置、整合Junit、AOP入门、基于配置文件的AOP、切入点表达式、基于配置的文件环绕通知

    学习基于注解的 IOC 配置,即注解配置 和 XML 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 , 所以这两种配置方式我们都需要掌握。 把 Spring 的 xml 配置内容改为使用

    2024年02月03日
    浏览(74)
  • javaee spring aop 注解实现

    2024年02月09日
    浏览(43)
  • 【Spring】使用自定义注解方式实现AOP鉴权

    AOP,是一种面向切面编程,可以通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 在软件开发中,鉴权(Authentication)是一项非常重要的安全措施,用于验证用户身份和权限。在应用程序中,我们通常会使用AOP(Aspect-Oriented Programming)来实现鉴权功能

    2024年02月11日
    浏览(46)
  • 【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

    ​ 注意,该类的两个细节: a、@Component注解向容器中注册一个Bean。 b、@Aspect注解表示这个是一个切面类。 c、@Before注解表示的是这个是前置增强/前置通知。 ​ 注意:对于业务Bean,我们也需要通过@Service注解来向容器中注册。 ​ 问题:我们看到对于切面类中定义的通知,有

    2024年04月23日
    浏览(49)
  • 注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】

    目录 一、注解配置AOP 1. 开启注解支持 2. 在类和方法加入注解 3. 测试 4.  为一个类下的所有方法统一配置切点 二、原生Spring实现AOP 1. 引入依赖 2. 编写SpringAOP通知类 3. 编写配置类bean2.xml 4  测试 三、SchemaBased实现AOP 1. 配置切面 2. 测试 往期专栏文章相关导读  1. Maven系列专栏

    2024年02月08日
    浏览(45)
  • Spring Boot学习随笔- 实现AOP(JoinPoint、ProceedingJoinPoint、自定义注解类实现切面)

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 问题 现有业务层开发存在问题 额外功能代码存在大量冗余 每个方法都需要书写一遍额外功能代码不利于项目维护 Spring中的AOP AOP:Aspect 切面 + Oriented 面向 Programmaing 面向切面编程 Aspect(切面) = Advice(通知) + Pointcut(

    2024年02月04日
    浏览(48)
  • 【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战

                                                 💧 S p r i n g A O P + 主从数据源切换 + 读写分离 + 自定义注解案例实战! color{#FF1493}{Spring AOP + 主从数据源切换 + 读写分离 + 自定义注解 案例实战!} Sp r in g A OP + 主从数据源切换 + 读写分离 + 自定义注解案例

    2024年02月15日
    浏览(38)
  • Spring5框架——AOP操作:通过Aspectj注解方式和配置文件方式来实现

    o((⊙﹏⊙))o. ** 之前的博客介绍了什么是AOP,以及AOP的底层原理,AOP主要是在原本的基础上添加一些之外的功能但是添加的功能是不会修改原定的代码,接下来为你介绍的是Aspectj注解,Spring 框架一般都是基于 AspectJ 实现 AOP 操作。AspectJ 不是 Spring 组成部分,独立 AOP 框架,一

    2024年02月16日
    浏览(49)
  • 对接第三方接口鉴权(Spring Boot+Aop+注解实现Api接口签名验证)

    一个web系统,从接口的使用范围也可以分为对内和对外两种,对内的接口主要限于一些我们内部系统的调用,多是通过内网进行调用,往往不用考虑太复杂的鉴权操作。但是,对于对外的接口,我们就不得不重视这个问题,外部接口没有做鉴权的操作就直接发布到互联网,而

    2024年04月29日
    浏览(83)
  • 8.4Java EE——基于注解的AOP实现

    元素 描述 @Aspect 配置切面 @Pointcut 配置切点 @Before 配置前置通知 @After 配置后置通知 @Around 配置环绕方式 @AfterReturning 配置返回通知 @AfterThrowing 配置异常通知 下面通过一个案例演示基于注解的AOP的实现,案例具体实现步骤如下。

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包