中国建设银行网站首页河西网点常德论坛网站
一.Spring的AOP简介
1.1 什么是AOP
    AOP  为  Aspect Oriented Programming  的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是  OOP  的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容。利用 AOP 可以对业务 逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低 ,提高程序的可重用性,同时提高了开发的效率。  
 
1.2 AOP的作用及其优势
 作用:在程序运行期间,在不修改源码的情况下对方法进行 增强  
 
 优势:减少重复代码,提高开发效率,并且便于维护  
 
1.3 AOP的底层实现
       实际上, AOP  的底层是通过  Spring  提供的的动态代理技术实现的。在运行期间, Spring 通过动态代理技术 动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能 的增强。  
 
1.4 AOP的动态代理技术
 常用的动态代理技术  
 
 JDK 代理:基于接口的动态代理技术  
 
 cglib 代理:基于父类的动态代理技术  
 
 
1.5 JDK的动态代理
 1.5.1  代理模式概述  
 
     为什么要有 '' 代理 ''? 生活中就有很多代理的例子,例如,我现在需要出国,但是我不愿意自己去办签证、预定 机票和酒店(觉得麻烦 ,那么就可以找旅行社去帮我办,这时候旅行社就是代理,而我自己就是被代理了。 代理模式的定义:被代理者没有能力或者不愿意去完成某件事情,那么就需要找个人代替自己去完成这件事, 这个人就是代理者,  所以代理模式包含了 3 个角色 :  被代理角色 代理角色 抽象角色 ( 协议 ) 
 
 1.5.2  静态代理  
 
 项目结构: 
 
 
package wwx.test02;
public interface Sing {public void sing();
}
-------------------------------------------
package wwx.test02;public class JinLian implements Sing {@Overridepublic void sing() {System.out.println("jinlian在唱歌");}
}
-------------------------------------------
package wwx.test02;public class WangPo implements Sing{JinLian jinLian;public WangPo(JinLian jinLian) {this.jinLian = jinLian;}@Overridepublic void sing() {jinLian.sing();}
}
-------------------------------------------
package wwx.test02;public class XiMen {public static void main(String[] args) {JinLian jl=new JinLian();WangPo wp=new WangPo(jl);wp.sing();
//被代理者没有能力或者不愿意去完成某件事情,
//那么就需要找个人代替自己去完成这件事,这个人就是代理者
//静态代理模式:代理类是实际存在的,根据代理类生成一个代理对象
//动态代理模式:代理类是不存在的,直接动态生成一个代理对象
//实现了静态代理}
}
------------------------------------------ 
 
 1.5.3  动态代理  
      概述  :  动态代理就是直接通过反射生成一个代理对象 , 代理对象所属的类是不需要存在的 动态代理的获取: jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象  
  
  参数 1:ClassLoader loader  被代理对象的类加载器  
  参数 2:Class<?>[] interfaces  被代理对象的要实现的接口 
  参数 3:InvocationHandler h ( 接口 ) 执行处理接口  
  返回值 :  代理对象  
  前 2 个参数是为了帮助在 jvm 内部生成被代理对象的代理对象 , 第 3 个参数 , 用来监听代理对象调用方  
  法 , 帮助我们调用方法  
  
  回调方法 :  当代理对象调用了方法 , 就会来执行该 invoke 方法 ,  在该方法中就可以增强  
  被代理类的方法  
  参数 1:  生成的代理对象 这里就是 p 这个代理对象  ( 慎用 )  
  参数 2:  当前代理对象执行的方法 这里 method 就是 happy() 方法对象  
  参数 3:  当前代理对象执行的方法 , 传入的实际参数  
  返回值 : 当前代理对象执行的方法的返回值  
   参数 1:  生成的代理对象 这里就是 p 这个代理对象  ( 慎用 )的原因:  
  
 package wwx.test03;public class JianLian implements Sing{@Overridepublic void sing() {System.out.println("金莲在唱歌");}
}------------------------------------------------------------------------------------
------------------------
package wwx.test03;public interface Sing {public void sing();
}------------------------------------------------------------------------------------
------------------------package wwx.test03;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;public class DemoTest {//    参数1:ClassLoader loader 被代理对象的类加载器
//    参数2:Class<?>[] interfaces 被代理对象的要实现的接口
//1.6 AOP相关概念
//    在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:
//    Target(目标对象):代理的目标对象
//    Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
//    参数3:InvocationHandler h (接口)执行处理接口
//    返回值: 代理对象
//            前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,用来监听代理对象调用方
//    法,帮助我们调用方法public static void main(String[] args) {JianLian jianLian=new JianLian();Sing p = (Sing) Proxy.newProxyInstance(JianLian.class.getClassLoader(),JianLian.class.getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Date date=new Date();System.out.println(date);method.invoke(jianLian,args);return null;}});p.sing();}
}
 
1.6 AOP相关概念
    在正式讲解  AOP  的操作之前,我们必须理解  AOP  的相关术语,常用的术语如下:  
  Target (目标对象):代理的目标对象  
  Proxy  (代理):一个类被  AOP  织入增强后,就产生一个结果代理类  
  Joinpoint (连接点):类里面哪些方法可以被增强,这些方法称为连接点, spring 只支持方法类型的连接点  
  Pointcut (切入点):实际被真正增强的方法,称为切入点  
  Advice (通知 /  增强):实际增强的逻辑部分称为通知(增强),通知有多种类型:  
  前置通知:指定增强的方法在切入点方法之前执行  
  后置通知:指定增强的方法在切入点方法之后执行  
  异常通知:指定增强的方法在出现异常时执行  
  最终通知:无论增强方式执行是否有异常都会执行  
  环绕通知:指定增强的方法在切入点方法之前和之后都执行  
  Aspect (切面):是切入点和通知(引介)的结合  
  Weaving (织入):是指把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而AspectJ 采用编译期织入和类装载期织入  
 1.7 AOP 开发明确的事项
 1.7.1  需要编写的内容  
  编写核心业务代码(目标类的目标方法)  
  编写切面类,切面类中有通知 ( 增强功能方法 )  
  在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合  
  1.7.2 AOP  技术实现的内容  
  Spring  框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代 理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。  
  1.7.3 AOP  底层使用哪种代理方式  
  在  spring  中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。  
 二.基于XML的AOP开发
 2.1  快速入门  
  1.  导入  AOP  相关坐标  
  2.  创建目标接口和目标类(内部有切点)  
  3.  创建切面类(内部有增强方法)  
  4.  将目标类和切面类的对象创建权交给  spring  
  5.  在  applicationContext.xml  中配置织入关系  
  6.  测试代码  
  
