AOP本质:在不改变原有业务逻辑的状况下加强横切逻辑,横切逻辑代码每每是权限校验代码、⽇志代码、事务控制代码、性能监控代码java
在讲解AOP术语以前,咱们先来看⼀下下⾯这两张图,它们是一个案例需求的扩展(针对这些扩展的需求,咱们只进⾏分析,在此基础上去进⼀步回顾AOP,不进⾏实现)spring
上图描述的就是未采⽤AOP思想设计的程序,当咱们红⾊框中圈定的⽅法时,会带来⼤量的重复劳动。程序中充斥着⼤量的重复代码,使咱们程序的独⽴性不好。⽽下图中是采⽤了AOP思想设计的程序,它 把红框部分的代码抽取出来的同时,运⽤动态代理技术,在运⾏期对须要使⽤的业务逻辑⽅法进⾏加强
链接点:⽅法开始时、结束时、正常运⾏完毕时、⽅法异常时等这些特殊的时机点,咱们称之为链接点,项⽬中每一个⽅法都有链接点,链接点是⼀种候选点
切⼊点:指定AOP思想一想要影响的具体⽅法是哪些,描述感兴趣的⽅法
切⾯概念是对上述概念的⼀个综合
Aspect切⾯ = 切⼊点+加强
= 切⼊点(锁定⽅法)+ ⽅位点(锁定⽅法中的特殊时机)+ 横切逻辑框架
众多的概念,⽬的就是为了锁定要在哪一个地⽅插⼊什么横切逻辑代码
性能
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配置中,也和IoC配置⼀样,⽀持3类配置⽅式设计