springAOP使用详情

AOP分为两种方式:xml配置和注解(@Aspect,@Pointcut和@advice).

  Pointcut Expression(切面表达式):指示器(designators(execution()和其他))、通配符(wildcards(*,..,+))和逻辑运算符(||、&&和!)。

  通配符: * 表示匹配任意数量的字符,+ 匹配指定类及其之类 和  .. 一般用于匹配任意数的子包或者参数。

  逻辑运算符:||(或)、&&(和)和!(非)。

  指示器:

      匹配方法:(execution())参数匹配(包含了方法名称和参数类型),

           表达式写法:@Pointcut("exectution(public(修饰符) 

                       *(返回值)

                      com.aop.service.*Service.*(..) (先是包名,然后是类方法名称、最后是参数类型)

                      throws  异常类型(异常跑抛出可选))"),子包在路径中使用 ..符号。

      匹配注解:@target()自定义注解,与Retetion注解一起使用、匹配方法级别(Retetion级别为RunTime)

             @within()匹配包或子包以及制定类(Retetion级别为CLASS)在spring环境下,target与within匹配注解级别无差别

             @args()匹配参数级别、

             @annotation()注解自定义注解的名称,主要匹配方法级别

      匹配包/类型:within(),匹配指定类或者指定包里面的所有方法

      匹配对象:this()是aop代理对象方法(可以对introduction增加的方法进行代理)、target()与this的却就是不能进行introduction代理和bean()是对bean所配置的进行方法代理

      匹配参数:args()参数匹配类型(参数个数可以使用 .. 省略多个参数,具体见通配符)

SpringAOP实现原理:主要是使用代理,静态代理(使用接口进行代理类实现和目标类实现)和动态代理(jdk代理和cglib代理)。

          静态代理:使用接口进行代理类实现和目标类实现。

          动态代理:基于接口代理和基于继承代理。

      JDK代理只能基于接口进行动态代理,使用java.lang.reflect.Proxy类动态生成代理类,实现接口invocationhandle。

      CGLIB代理是基于继承实现代理,无法对static、final类代理,无法对static、private方法进行代理。

 sop的应用:@Translational,@PreAuthorize(权限,需要引入security依赖); @Cacheable;   

原文地址:https://www.cnblogs.com/cqyy/p/9401405.html