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 ...
随机推荐
- 关于Android Studio中Gradle的一些乱七八糟的问题
版本下载:https://gradle.org/releases/ 一个很详细的blog说明文:https://www.cnblogs.com/smyhvae/p/4390905.html,不贴具体内 ...
- Jenkins之自动发送git变更到微信
当我们通过Jenkins构建job的时候,是可以获取到git Change Log 的信息, 即本次上线修改了什么功能,我们将这个信息发送到微信群相关人员可直接获取到上线变更信息, 这样就不需要人为的 ...
- swift 第二课 基础知识-2
setter 和getter 的使用--> 适合计算使用 struct Point { var x = 0.0, y=0.0 } struct Size { var width = 0.0, h ...
- RESTful架构(Representational State Transfer资源表现层状态转换)
1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...
- Vue 组件基础完整示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- webdriervAPI(鼠标事件)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains 导 ...
- webdriervAPI(CSS定位元素)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- Github搭建个人博客的总结
1. 参考 这个 博客 : https://blog.csdn.net/xudailong_blog/article/details/78762262 2. 把上面按照的就安装,并把git 仓库克隆 ...
- 玩转ELK之三件套安装配置详解
ELK是啥子??? ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash 和 Kibana. 特点: 收集 ...
- Hadoop 之 HDFS API操作
1. 文件上传 @Slf4j public class HDFSClient { @Test public void testCopyFromLocalFile() throws Exception{ ...