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. python内置数据结构

    数据类型: 数值型 int float complex bool 序列对象 字符串 str 列表 list 元组 tuple 键值对 集合 set 字典dict 数值型: int.float.comp ...

  2. C语言tips_2 关于scanf 读取规则小结以及与getchar 的区别

    第一点:scanf默认回车和空格是输入不同组之间的间隔和结束符号. 也就是说他不会读取 空格 和 换行符.而是把他们当作一个 数据被读取完成的标志!他的停止标志则为,当%d之类的数据输入结束之后,自动 ...

  3. java中length和length()的区别?

    在java中String类可以定义字符串变量和字符串数组,length()用于求String字符串对象的长度,而length用  于求String字符串数组的长度.  length()是求String ...

  4. 01.04 linux命令(2

    ======================Linux下的用户管理==============用户信息保存/etc/passwd ,一般用户都有读的权限真正的用户:修改密码,可以登录伪用户:应用程序在 ...

  5. winform 更新文件上传(一)

    using Common; using DevExpress.XtraEditors; using FileModel.UpLoad; using System; using System.Colle ...

  6. Python安装pip3

    在新的电脑上,偶尔会出现无法安装pip的问题. 今天看见了一位大神的方法: 在cmd窗口中输入python -m ensurepip 然后使用pip命令安装其他包.pip3 install 模块名 说 ...

  7. 使用Navicat为数据库表建立触发器

    打开Navicat   打开数据表所在的数据库,右击需要新增字段的数据库表,然后点击[设计表]   此时进入表设计界面   点击[触发器]标签页,输入触发器名称,如trigger1   选择触发条件, ...

  8. [AT2062] ~K Perm Counting

    AT2602 , Luogu 求对于 \(n\) 个数的排列 , 有多少种方案满足对于所有的 \(i\) , \(|P_i - i| != K\) , 答案对 \(924844033\) 取模 . \ ...

  9. 大白带你侃JAVA——封装的概述及好处

    封装概述: 封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式 这是什么意思呢? 简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, "锁起来" ,我们只留下 ...

  10. TemplateView , ListView ,DetailView三种常用类视图用法

    参考博客: https://blog.csdn.net/weixin_36571185/article/details/74280102