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 又不能完成业务逻辑的增加和删除,所以 各司其职

4.AOP原理模拟的更多相关文章

  1. spring ioc aop 原理

    spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...

  2. 1.IOC原理模拟

    Spring两大核心功能,IOC(Inverse  of  Control)  和 AOP(Aspect-Oriented-Programming) IOC原理模拟: 有这样一个beans.xml: ...

  3. Spring中AOP的模拟实现

    什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面 面向 ...

  4. SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)

    接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...

  5. SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

    AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP之所以能得到广泛应用,主要是因为它将应用系统拆分分了2个部分 ...

  6. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  7. spring MVC 及 AOP 原理

    SpringMVC工作原理https://www.cnblogs.com/xiaoxi/p/6164383.htmlspring MVC 原理https://blog.csdn.net/y199108 ...

  8. spring aop 原理学习

    @EnableAspectJAutoProxy: @Import(AspectJAutoProxyRegistrar.class) 实际是创建了一个以org.springframework.aop.c ...

  9. Spring之AOP原理、代码、使用详解(XML配置方式)

    Spring 的两大核心,一是IOC,另一个是AOP,本博客从原理.AOP代码以及AOP使用三个方向来讲AOP.先给出一张AOP相关的结构图,可以放大查看. 一.Spring AOP 接口设计 1.P ...

随机推荐

  1. C++ list 查找

    #include <iostream>#include <list>#include <algorithm> using namespace std; int ma ...

  2. SQL语法介绍

    一.Select 查询 语法: mysql> help selectName: 'SELECT'Description:Syntax:SELECT [ALL | DISTINCT | DISTI ...

  3. win7上 nginx 出现 403 Forbidden

    一般是目录权限问题,在conf文件找到 location / { index index.html index.htm index.php;# autoindex on; } 把#去掉就可以了.

  4. 工作流调度器之Azkaban

    Azkaban 1. 工作流调度器概述 1.1. 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive脚本等 ...

  5. JAVA 基础编程练习题41 【程序 41 猴子分桃】

    41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...

  6. Pedro domingos

    Dear Professor:           I am a university student in China and study on MLN recently;             ...

  7. Entity Framework链接数据库设置

    本人不才,学习EntityFramwork同时做个记录供大家参考.不多说,直接上步骤 1.在WebConfig中添加如下代码段 <connectionStrings> <add na ...

  8. 撸一个vue的双向绑定

    1.前言 说起双向绑定可能大家都会说:Vue内部通过Object.defineProperty方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更 ...

  9. Jmeter 逻辑控制器 之 Include Controller

    一.认识 Include Controller Include Controller :译为包含控制器,用来添加 Test Fragment(测试片段).具体是什么意思呢,我们先来了解下 Test F ...

  10. 能力不足的C++开发会欺辱能力不足C#开发

    能力不足的C++开发会欺辱能力不足C#开发 我被C++开发欺辱的岁月   前言 人被压迫了,为什么不斗争?——鲁迅 作为一个C#开发者,我经历了,也见证了很多同行饱受C++开发的歧视和欺辱. 而且,这 ...