??????
哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!???
✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。
✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。
✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注【一心同学】???
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
目录
介绍
在学习Spring的AOP之前,我们需要先来学习一下代理模式,因为AOP的底层机制就是动态代理。
什么是代理模式?
用通俗易懂的讲解方式就是:
小明开车,装上围栏,出车祸了,这时小明需要做的事有:
(1)检查车祸现场
(2)交罚款
(3)维修汽车
但是小明有钱,于是他请来了一位师傅,帮他处理(1)(2)这两件事,而小明只需要交罚款就好了。
这个例子就是代理模式,小明是被代理的角色,师傅是代理角色。
代理模式分为两种:
静态代理
动态代理
一、 静态代理
代码实现:
事故的接口:
public interface Accident {
public void deal();
}
被代理的对象:
public class Person implements Accident{
public void deal() {
System.out.println("上交罚款");
}
}
代理对象:
public class Proxy implements Accident{
private Person person;
public Proxy(Person person){
this.person=person;
}
public void deal(){
check();
person.deal();
fixCar();
}
public void check(){
System.out.println("检查车祸现场");
}
public void fixCar(){
System.out.println("维修汽车");
}
}
测试:
@Test
public void test(){
Person person=new Person();
Accident accident=new Proxy(person);
accident.deal();
}
输出:
分析:在这个过程中,假如我是交通警察,那我接触到的只有这个师傅,而不需要小明出面解决。
静态代理的好处:
可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 .
公共的业务由代理来完成 . 实现了业务的分工 ,
公共业务发生扩展时变得更加集中和方便 .
缺点 :
类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 .
二、动态代理
解决静态代理的类太多的问题。
动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
基于接口的动态代理----JDK动态代理
基于类的动态代理--cglib
这里我们只讲基于接口的动态代理,因为实现的思想都差不多,我们只需要去理解动态代理的思想即可。
我们需要来了解两个核心类:InvocationHandler 和 Proxy
2.1 InvocationHandler
作用:调用处理程序的接口
方法:
Object invoke(Object proxy, 方法 method, Object[] args);
参数解析:proxy - 调用该方法的代理实例
method -所述方法对应于调用代理实例上的接口方法的实例。方法对象的声明类将是该方法声明的接口,它可以是代理类继承该方法的代理接口的超级接口。
args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。原始类型的参数包含在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean 。
2.2 Proxy
作用:提供了创建动态代理和实例的静态方法。
newProxyInstance(ClassLoader loader,类<?>[] interfaces,InvocationHandler h)
参数解析:
loader - 类加载器来定义代理类
interfaces - 代理类实现的接口列表
h - 调度方法调用的调用处理函数
那么我们现在就可以开始来玩动态代理了。
跟静态代理不一样的地方就是代理角色了。
2.3 实现
接口:
public interface Accident {
public void deal();
}
被代理的对象:
public class Person implements Accident{
public void deal() {
System.out.println("上交罚款");
}
}
代理:
package com.yixin.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
private Person person;
public void setPerson(Person person){
this.person=person;
}
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
person.getClass().getInterfaces(),this);
}
//进行处理事务
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
check();
Object result = method.invoke(person, args);
fixCar();
return result;
}
public void check(){
System.out.println("检查车祸现场");
}
public void fixCar(){
System.out.println("维修汽车");
}
}
测试:
@Test
public void test2(){
Person person=new Person();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setPerson(person);
Accident accident=(Accident)pih.getProxy();
accident.deal();
}
核心:一个动态代理 , 一般代理某一类业务 , 一个动态代理可以代理多个类,代理的是接口!
动态代理的好处:
静态代理有的它都有,静态代理没有的,它也有!
可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 .
公共的业务由代理来完成 . 实现了业务的分工 ,
公共业务发生扩展时变得更加集中和方便 .
一个动态代理 , 一般代理某一类业务
一个动态代理可以代理多个类,代理的是接口!
结语
以上就是【一心同学】对代理模式中的静态代理和动态代理的讲解了,我们明白了代理模式,接下来就可以开始学习Spring的AOP了,因为AOP的底层机制就是动态代理。