Spring框架04-AOP应用

Spring AOP 应⽤

AOP本质:在不改变原有业务逻辑的状况下加强横切逻辑,横切逻辑代码每每是权限校验代码、⽇志代码、事务控制代码、性能监控代码java

AOP 相关术语

业务主线

在讲解AOP术语以前,咱们先来看⼀下下⾯这两张图,它们是一个案例需求的扩展(针对这些扩展的需求,咱们只进⾏分析,在此基础上去进⼀步回顾AOP,不进⾏实现)
image.pngspring

上图描述的就是未采⽤AOP思想设计的程序,当咱们红⾊框中圈定的⽅法时,会带来⼤量的重复劳动。程序中充斥着⼤量的重复代码,使咱们程序的独⽴性不好。⽽下图中是采⽤了AOP思想设计的程序,它    把红框部分的代码抽取出来的同时,运⽤动态代理技术,在运⾏期对须要使⽤的业务逻辑⽅法进⾏加强

image.png

AOP 术语

  • Joinpoint(链接点):它指的是那些能够⽤于把加强代码加⼊到业务主线中的点,那么由上图中咱们能够看出,这些点指的就是⽅法。在⽅法执⾏的先后经过动态代理技术加⼊加强的代码。在Spring框架AOP思想的技术实现中,也只⽀持⽅法类型的链接点
  • Pointcut(切⼊点):它指的是那些已经把加强代码加⼊到业务主线进来以后的链接点。由上图中,咱们看出表现层 transfer⽅法就只是链接点,由于判断访问权限的功能并无对其加强
  • Advice(通知加强):它指的是切⾯类中⽤于提供加强功能的⽅法。而且不一样的⽅法加强的时机是不⼀样的。⽐如,开启事务确定要在业务⽅法执⾏以前执⾏;提交事务要在业务⽅法正常执⾏以后执⾏,⽽回滚事务要在业务⽅法执⾏产⽣异常以后执⾏等等。那么这些就是通知的类型。其分类有:前置通知 后置通知 异常通知 最终通知 环绕通知
  • Target(⽬标对象):它指的是代理的⽬标对象。即被代理对象
  • Proxy(代理):它指的是⼀个类被AOP织⼊加强后,产⽣的代理类,即代理对象
  • Weaving(织⼊):它指的是把加强应⽤到⽬标对象来建立新的代理对象的过程。spring采⽤动态代理织⼊,⽽AspectJ采⽤编译期织⼊和类装载期织⼊
  • Aspect(切⾯):它指定是加强的代码所关注的⽅⾯,把这些相关的加强代码定义到⼀个类中,这个类就是切⾯类。例如,事务切⾯,它⾥⾯定义的⽅法就是和事务相关的,像开启事务,提交事务,回滚事务等等,不会定义其余与事务⽆关的⽅法。咱们前⾯的案例中 TrasnactionManager就是⼀个切⾯
链接点:⽅法开始时、结束时、正常运⾏完毕时、⽅法异常时等这些特殊的时机点,咱们称之为链接点,项⽬中每一个⽅法都有链接点,链接点是⼀种候选点
切⼊点:指定AOP思想一想要影响的具体⽅法是哪些,描述感兴趣的⽅法

Advice加强

  • 第⼀个层次:指的是横切逻辑
  • 第⼆个层次:⽅位点(在某⼀些链接点上加⼊横切逻辑,那么这些链接点就叫作⽅位点,描述的是具体的特殊时机)
Aspect切⾯

切⾯概念是对上述概念的⼀个综合
Aspect切⾯ = 切⼊点+加强
= 切⼊点(锁定⽅法)+ ⽅位点(锁定⽅法中的特殊时机)+ 横切逻辑框架

众多的概念,⽬的就是为了锁定要在哪一个地⽅插⼊什么横切逻辑代码性能

Spring中AOP的代理选择

Spring 实现AOP思想使⽤的是动态代理技术ui

默认状况下,Spring会根据被代理对象是否实现接⼝来选择使⽤JDK动态代理仍是CGLIB。当被代理对象没有实现任何接⼝时,Spring会选择CGLIB。当被代理对象实现了接⼝,Spring会选择JDK官⽅的代理技术,不过咱们能够经过配置的⽅式,让Spring强制使⽤CGLIB
DefaultAopProxyFactory.java源码spa

public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        //用JDK仍是CGlib
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: " +
                        "Either an interface or a target is required for proxy creation.");
            }
            if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                return new JdkDynamicAopProxy(config);
            }
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }

Spring中AOP的配置⽅式

在Spring的AOP配置中,也和IoC配置⼀样,⽀持3类配置⽅式设计

  • 第⼀类:使⽤XML配置
  • 第⼆类:使⽤XML+注解组合配置
  • 第三类:使⽤纯注解配置