Spring 实现Aop的原理与示例

Spring 实现Aop的原理

Spring Aop

AOP(Aspect Oriented Programming),意思为:面向切面编程,是一种通过预编译方式和运行期间动态代理实现程序功能的统一维护的技术。SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理。Spring Aop,依托Spring的IOC容器,能够为容器中管理的对象生成动态代理对象,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

Spring 实现Aop的原理

上一篇简单介绍了动态代理的原理区别和简单使用,现在我们来简单回顾一下:

1.动态代理(其局限性,被代理对象必须要实现接口,才能产生代理对象,如果没有接口将不能使用动态代理技术)
Proxy.newProxyInstance(classLoader.Interface[] arr,InvocationMandeler handler)

2.cglib代理(其优点,作为第三方代理技术,cglib可以对任何类生成代理,代理的原理是对目标对象进行继承代理。但如果目标是被final修饰符修饰,那么该类无法被cglib代理)

总结,有接口存在时,优先使用动态动态,无接口时用cglib代理。spring aop封装了动态代理代码,我们就不需要手写动态代理代码,还封装了cglib代理,可以对任何类实现代理增强。

Spring Aop中的名词解释

  1. 连接点( Joinpoint): 所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点

  2. Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义

  3. Advice(通知/增强):所谓通知是指拦截到Joinpoint之后要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

    • 前置通知(Before Advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。
      例如,TestAspect 中的 doBefore 方法。

    • 后置通知(After Advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
      例如,ServiceAspect 中的 returnAfter 方法,所以 Teser 中调用 UserService.delete 抛出异常时,returnAfter 方法仍然执行。

    • 返回后通知(After Return Advice):在某连接点正常完成后执行的通知,不包括抛出异常的情况。

    • 环绕通知(Around Advice):包围一个连接点的通知,类似 Web 中 Servlet 规范中的 Filter 的 doFilter 方法。可以在方法的调用前后完成自定义的行为, 也可以选择不执行。
      例如,ServiceAspect 中的 around 方法。

    • 异常通知(After Throwing Advice):在方法抛出异常退出时执行的通知 。

  4. Introduction(引介):引介是一种特殊的通知在不修改代码的前提下,Introduction可以以运行期为类,动态地添加一些方法或Field

  5. Target(目标对象):代理的目标对象

  6. Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程,spring采用动态代理来织入,而AspectJ采用编译期织入和类装载期织入

  7. Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类Aspect(切面),是切入点和通知(引介)的结合。

应用示例

  1. 对所有进行登录操作的用户进行拦截,打印登录日志存入数据库
    对所需要拦截的方法添加注解:@LogAnnotation
    /**
     * 用户登录
     *
     * @param zh      帐号
     * @param mm      密码
     * @throws Exception
     * 添加注解 @LogAnnotation,进行拦截
     */
    @PostMapping("login")
    @LogAnnotation(value = "登陆",remark = "登陆",operation = "登陆操作")
    public ResponseVo login(String zh, String mm) throws Exception {
   
    	//TODO 登录逻辑
    }
  1. 实现注解
@Target({
   ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
   
    String value() default "";

    String remark() default "";

    String operation() 

你可能感兴趣的:(Java动态代理,spring,spring,java,后端)