Blog

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

Proxy

发表于 2019-08-11 分类于 代理模式 阅读次数:
本文字数: 3.4k

简介

代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

静态代理

创建接口
1
2
3
interface Factory{
void Product();
}
创建被代理类
1
2
3
4
5
6
7
8
//被代理类
class Nike implements Factory{

@Override
public void Product() {
System.out.println("生产NIKE产品");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//代理类,用于增强方法
class ProxyFactory implements Factory{

private Factory factory;

public ProxyFactory(Factory factory) {
this.factory = factory;
}
@Override
public void Product() {
System.out.println("准备一些生产NIKE产品的材料");
factory.Product(); //调用的是被代理类的方法
System.out.println("处理一下生产后的事情");
}
}
测试
1
2
3
4
5
6
7
8
public class Test1 {
@org.junit.Test
public void test1(){
NikeFactory nikeFactory = new NikeFactory();
ProxyFactory proxyFactory = new ProxyFactory(nikeFactory);
proxyFactory.Product();
}
}

缺点:静态代理时,每一个被代理类都需要各自创建一个代理类

动态代理

创建接口
1
2
3
interface NewFactory{
void Product();
}
创建被代理类
1
2
3
4
5
6
7
class LiNing implements NewFactory{

@Override
public void Product() {
System.out.println("生产LiNing产品");
}
}
创建一个类用来生成代理对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ProxyFactory2{
//根据被代理类获取代理类
public static Object getProxyFactory(Object obj){
MyInvocationHandler handler = new MyInvocationHandler(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
}
}
class MyInvocationHandler implements InvocationHandler{
private Object obj; //被代理类对象

public MyInvocationHandler(Object obj) {
this.obj = obj;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始准备工作");
Object invoke = method.invoke(obj, args); //调用被代理类obj中的方法
System.out.println("开始结束工作");
return invoke;
}
}
测试
1
2
3
4
5
6
7
8
9
10
11
12
public class Test2 {
public static void main(String[] args) {
LiNing liNing = new LiNing();
NewFactory proxyFactory = (NewFactory) ProxyFactory2.getProxyFactory(liNing); //获取被代理类
proxyFactory.Product();

Nike nike = new Nike();
Factory proxyFactory1 = (Factory) ProxyFactory2.getProxyFactory(nike);
proxyFactory1.Product();

}
}

cglib代理

创建代理工厂
1
2
3
4
5
6
7
8
9
public class CglibProxyFactory {
public static Object getProxyInstance(MyMethodInterceptor myMethodInterceptor,Class clazz ){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(myMethodInterceptor);
Object o = enhancer.create();
return o;
}
}
MyMethodInterceptor
1
2
3
4
5
6
7
8
9
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("开始准备工作");
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println("开始结束工作");
return o1;
}
}
测试
1
2
3
MyMethodInterceptor myMethodInterceptor = new MyMethodInterceptor();
Nike proxyInstance = (Nike) CglibProxyFactory.getProxyInstance(myMethodInterceptor,nike.getClass());
proxyInstance.Product();

总结

代理模式就是为了增强方法,其中JDK代理和Cglib动态代理的区别如下:

  • 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
  • 如果目标对象实现了接口,可以强制使用CGLIB实现AOP
    就是说,JDK代理只能代理那些有接口的,通过实现同一个接口实现,而CGLIB则是通过继承被代理类来生成代理对象。

------ 已触及底线感谢您的阅读 ------
麻辣香锅不要辣 微信支付

微信支付

  • 本文作者: 麻辣香锅不要辣
  • 本文链接: https://http://ybhub.gitee.io/2019/08/11/Proxy/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
# SpringAop # Proxy # CGLIB和JDK
SpringAop------代理对象的创建(二)
Mybatis_参数处理过程
  • 文章目录
  • 站点概览
麻辣香锅不要辣

麻辣香锅不要辣

21 日志
11 分类
20 标签
GitHub 简书
  1. 1. 简介
  2. 2. 静态代理
    1. 2.1. 创建接口
    2. 2.2. 创建被代理类
    3. 2.3. 测试
  3. 3. 动态代理
    1. 3.1. 创建接口
    2. 3.2. 创建被代理类
    3. 3.3. 创建一个类用来生成代理对象
    4. 3.4. 测试
  4. 4. cglib代理
    1. 4.1. 创建代理工厂
    2. 4.2. MyMethodInterceptor
    3. 4.3. 测试
  5. 5. 总结
© 2019 – 2020 麻辣香锅不要辣 | 站点总字数: 20.4k字
|
0%