zoukankan      html  css  js  c++  java
  • SpringBoot AOP注解式拦截与方法规则拦截

         AOP的本质还是动态代理对方法调用进行增强。

      SpringBoot 提供了方便的注解实现自定义切面Aspect。

      1、使用需要了解的几个概念:

                切面、@Aspect

                切点、@Pointcut、

                通知、@Before/@After/@Around/@AfterReturning/@AfterThrowing

      2、Pointcut expression表达式规则 

        Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的.
        Pointcut可以有下列方式来定义或者通过通配符&& || !的方式进行组合.


        args()、@args() 

        execution()

        this()

        target() 、@target()

           within()、@within()

        @annotation

    举例说明:
      任意公共方法的执行:
      execution(public * *(..))

      任何一个以“set”开始的方法的执行:
      execution(* set*(..))‘


      AccountService 接口的任意方法的执行:
      execution(* com.xyz.service.AccountService.*(..))

      定义在service包里的任意方法的执行:
      execution(* com.xyz.service.*.*(..))

      定义在service包和所有子包里的任意类的任意方法的执行:
      execution(* com.xyz.service..*.*(..))

      定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
      execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
      ***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..))

      pointcutexp包里的任意类.
      within(com.test.spring.aop.pointcutexp.*)


      pointcutexp包和所有子包里的任意类.
      within(com.test.spring.aop.pointcutexp..*)


      实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类.
      this(com.test.spring.aop.pointcutexp.Intf)
      ***> 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型.

      带有@Transactional标注的所有类的任意方法.
      @within(org.springframework.transaction.annotation.Transactional)
      @target(org.springframework.transaction.annotation.Transactional)

      带有@Transactional标注的任意方法.
      @annotation(org.springframework.transaction.annotation.Transactional)
      ***> @within和@target针对类的注解,@annotation是针对方法的注解

      参数带有@Transactional标注的方法.
      @args(org.springframework.transaction.annotation.Transactional)


      参数为String类型(运行是决定)的方法.
      args(String)

        

    这篇文章写得不错可参考:https://www.jianshu.com/p/fbbdebf200c9

  • 相关阅读:
    JDBC 查询的三大参数 setFetchSize prepareStatement(String sql, int resultSetType, int resultSetConcur)
    有空必看
    SpringMVC 利用AbstractRoutingDataSource实现动态数据源切换
    FusionCharts JavaScript API Column 3D Chart
    FusionCharts JavaScript API
    FusionCharts JavaScript API
    Extjs 继承Ext.Component自定义组件
    eclipse 彻底修改复制后的项目名称
    spring 转换器和格式化
    Eclipse快速生成一个JavaBean类的方法
  • 原文地址:https://www.cnblogs.com/irobotzz/p/11910909.html
Copyright © 2011-2022 走看看