4.AOP原理模拟
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原理模拟的更多相关文章
- spring ioc aop 原理
spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...
- 1.IOC原理模拟
Spring两大核心功能,IOC(Inverse of Control) 和 AOP(Aspect-Oriented-Programming) IOC原理模拟: 有这样一个beans.xml: ...
- Spring中AOP的模拟实现
什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面 面向 ...
- SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)
接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...
- SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP
AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP之所以能得到广泛应用,主要是因为它将应用系统拆分分了2个部分 ...
- 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)
Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...
- spring MVC 及 AOP 原理
SpringMVC工作原理https://www.cnblogs.com/xiaoxi/p/6164383.htmlspring MVC 原理https://blog.csdn.net/y199108 ...
- spring aop 原理学习
@EnableAspectJAutoProxy: @Import(AspectJAutoProxyRegistrar.class) 实际是创建了一个以org.springframework.aop.c ...
- Spring之AOP原理、代码、使用详解(XML配置方式)
Spring 的两大核心,一是IOC,另一个是AOP,本博客从原理.AOP代码以及AOP使用三个方向来讲AOP.先给出一张AOP相关的结构图,可以放大查看. 一.Spring AOP 接口设计 1.P ...
随机推荐
- C++ list 查找
#include <iostream>#include <list>#include <algorithm> using namespace std; int ma ...
- SQL语法介绍
一.Select 查询 语法: mysql> help selectName: 'SELECT'Description:Syntax:SELECT [ALL | DISTINCT | DISTI ...
- win7上 nginx 出现 403 Forbidden
一般是目录权限问题,在conf文件找到 location / { index index.html index.htm index.php;# autoindex on; } 把#去掉就可以了.
- 工作流调度器之Azkaban
Azkaban 1. 工作流调度器概述 1.1. 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive脚本等 ...
- JAVA 基础编程练习题41 【程序 41 猴子分桃】
41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...
- Pedro domingos
Dear Professor: I am a university student in China and study on MLN recently; ...
- Entity Framework链接数据库设置
本人不才,学习EntityFramwork同时做个记录供大家参考.不多说,直接上步骤 1.在WebConfig中添加如下代码段 <connectionStrings> <add na ...
- 撸一个vue的双向绑定
1.前言 说起双向绑定可能大家都会说:Vue内部通过Object.defineProperty方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更 ...
- Jmeter 逻辑控制器 之 Include Controller
一.认识 Include Controller Include Controller :译为包含控制器,用来添加 Test Fragment(测试片段).具体是什么意思呢,我们先来了解下 Test F ...
- 能力不足的C++开发会欺辱能力不足C#开发
能力不足的C++开发会欺辱能力不足C#开发 我被C++开发欺辱的岁月 前言 人被压迫了,为什么不斗争?——鲁迅 作为一个C#开发者,我经历了,也见证了很多同行饱受C++开发的歧视和欺辱. 而且,这 ...