AOP   Aspect-Oriented-Programming    面向切面编程

  a)是对面向对象的思维方式的有力补充

好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码

  a)Filter

  b)Struts2 的 interceptor

Spring AOP的实现依赖于 Java的 Proxy 类

  1.首先创建目标对象(需要被代理的对象)(即该对象的方法的执行前后有业务逻辑的添加)

  UserService service =  new UserServiceImpl();

  2.创建一个 InvocationHandler,在这个InvocationHandler中,可以指明需要添加的业务逻辑

  Interceptor  interceptor = new  Interceptor ();      //public class Interceptor implements InvocationHandler

 

  3.将目标对象放到 InvocationHandler中,由InvocationHandler 来执行整个业务(添加的业务 + 原来的业务)

  interceptor.setTarget(service);

  

  4.代理对象的创建,在创建时,会参考被代理对象实现的接口,代理对象也去实现这些接口

  另外,每个代理里面帝实有 InvocationHandler 对象存在的

  UserService userProxy = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), interceptor);

  如上:userProxy 其实是一个实现了UserService接口的 Proxy对象,

  //可能这也是为什么  Proxy.newProxyInstance  只能由 接口去接收的原因吧

注:!!一个类 如果在实现了接口的情况下,来为这个类创建一个代理对象时,实现代理时,用jdk 自带的 Proxy 和 InvocationHandler,来帮你产生代理

  这个类如果没有实现接口,那么它会直接用操作二进制码的类库(cglib.jar)来帮你产生代理的代码

  5.使用代理对象,调用add方法(因为userProxy 是实现了UserService接口的,所以是可以调用的)

    userProxy.add();

    //5.1 一旦代理对象调用 add方法,代理对象会 反射Method m = UserDAO.getClass.getMethod 拿到add方法对应的Method对象

    //5.2 然后调用InvocationHandler 中的 invoke (Object proxy, Method method, Object[] args)

  代理对象 add 方法的调用 实际上就是让 InvocationHandler 去处理了,代理对象负责拿到执行方法必要的条件

InvocationHandler 的实现类

 public class Interceptor implements InvocationHandler {

     //被代理对象
private Object target; public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("方法要执行了");
//调用被代理对象的方法,指明调用哪个被代理对象 ,用到了哪些参数
method.invoke(target, args);
return null;
} }

  

感觉像是在 被代理的对象上面 先包了一层 InvocationHandler,然后在InvocationHandler上再包了一层 Proxy

  然后调用的时候,先去调用Proxy 的 add方法,调用的时候可以拿到执行add方法所必须的条件参数

  然后内部再去调用  InvocationHandler 的invoke方法,在InvocationHandler 的invoke方法里面,

  有新添加的业务逻辑和 本来要执行方法,通过这个invoke方法的执行,来完成动态的添加和删除在切面上的逻辑,

  而不影响原来的执行代码

为什么要分 Proxy  和  InvocationHandler

  因为InvocationHandler 获取不到 执行原本的方法 所需要的参数,必须要通过Proxy 给它

  Proxy 又不能完成业务逻辑的增加和删除,所以 各司其职

最新文章

  1. Android-Menu [使用C# And Java实现]
  2. SQL Server常用的性能诊断语句
  3. sysbench测试工具
  4. auto refresh iframe
  5. C#中out和ref之间的区别
  6. 【ILSpy反编译】C# 写的程序反编译查看是不是也太容易了点吧,太恐怖了。。。
  7. SCSF智能客户端学习笔记(一)
  8. easymock入门贴
  9. 为什么V8引擎这么快?(转载)
  10. MySql中启用InnoDB数据引擎的方法
  11. Java基础(二十三)GUI图形界面编程(Java基础完)
  12. JavaScript 浮点数运算 精度问题
  13. 监听enter事件
  14. windows Git安装
  15. nao安装中文包教程
  16. Jmeter元件运行顺序
  17. MySQL事务的介绍+事务的特性+事务的开启
  18. SSH框架下ajax调用action并生成JSON再传递到客户端【以get和post方式提交】
  19. jenkins 持续集成iOS开发
  20. 【转】npm install、npm install --save与npm install --save-dev区别

热门文章

  1. Win7 双系统安装Centos7,并由windows引导程序引导
  2. java字符串MD5加密后再转16进制
  3. 一百三十五:CMS系统之UEditoe编辑器集成以及配置将图片上传到七牛
  4. ubuntu kylin 18.04 安装 Qt Creator 5.11
  5. Pandas与Matplotlib结合进行可视化
  6. tomcat-APR配置及三种工作模式简介
  7. CentOS7.1 VNC Server服务配置
  8. Junit测试类中如何调用Http通信
  9. idea配置glassFish启动项目
  10. LRU算法简介