AOP

AOP的底层原理是使用动态代理。

  1.JDK动态代理  使用接口方式实现动态代理

  2.CGLIB动态代理  没有接口,使用继承方式实现动态代理

 

AOP术语

  1.连接点

    类里面的哪些方法可以被增强,这些方法称为连接点。

  2.切入点

    实际被真正增强的方法,称为切入点。

  3.通知(增强)

    1)实际增强的逻辑部分称为通知(增强)

    2)通知有很多种类型

      * 前置通知

      * 后置通知

      * 环绕通知

      * 异常通知

      * 最终通知(最后始终会被执行,相当于finaly)  

  4.切面

    把通知应用到切入点的过程(动作)

 

AOP操作

  准备工作

  有多种方式可以实现,但Spring一般都基于AspectJ实现AOP操作

  1.引入依赖

    spring-aspects, com.springsource.net.sf.cglib, com.springsource.org.aopalliance, com.springsource.org.aspectj.weaver

  2.切入点表达式。(知道要对哪个类里面的哪个方法进行增强)

  execution([权限修饰符] [返回类型] [类全路径] [方法名称]([方法参数]))

    1)excution(* com.duobee.dao.UserDao.add(..))  UserDao里add方法

    2)excution(* com.duobee.dao.UserDao.*(..))  UserDao类里所有方法

    3)excution(* com.duobee.dao.*.*(..))  dao包里所有类,所有方法

 

具体操作

  1. 在spring配置文件中,开启注解扫描

  2. 使用注解创建类的对象

  3. 在增强类上面添加注解 @Aspect

  4. 在spring配置文件中开启生成代理对象

    <aop:sapectj-autoproxy></aop:sapectj-autoproxy> 意思是在spring容器中找到@aspect注解,有就创建代理对象。

  5. 配置不同类型的通知。

    1)在增强类的里面,在作为通知的方法上面添加通知类型的注解,使用切入点表达式配置作用域

    @Around(value="excution(* com.duobee.dao.*.*(..))")

    public void around(ProceedingJoinPoint proceedingJoinPoint ) throws Throwable{

      System.out.println("环绕之前............");

      //被增强的方法执行

      proceedingJoinPoint.proceed();

      System.out.println("环绕之后............");

    }

   6.相同的切入点进行抽取。

    定义一个方法, 方法名字自定义,在方法上面加入注解@Pointcut(value="excution(* com.duobee.dao.*.*(..))")

   7. 有多个增强类在同一个方法进行增强,设置增强类的优先级

    在增强类的上面添加注解@Order(数值类型值),数值类型的值越小优先级越高, 从0开始

    

    使用的时候只需要在通知类型注解的value里面加入方法名称就可以使用公共的切入点了。

 完全注解开发

    @Configuration  注解配置类

    @ComponentScan(basePackages={"com.duobee"})  配置注解扫描类

    @EnableAspectJAutoProxy(proxyTargetClass=true)  配置生成代理对象

  

posted @ 2020-11-22 21:33  doubisme  阅读(134)  评论(0)    收藏  举报