首页 > 编程语言 >【代理】【一】代理源码解析-导读

【代理】【一】代理源码解析-导读

时间:2023-02-20 17:03:57浏览次数:32  
标签:对象 代理 导读 源码 userService UserService 动态 public

1  什么是代理

代理是指给某一个对象提供一个代理对象,代理对象持有原对象的引用。一句话通过代理对象增强原对象的功能,比如在原对象调用一个方法的前后进行日志、事务操作等。Spring AOP就使用了代理模式。

2  代理的分类

代理又分为静态代理和动态代理,所谓静动站在我们自己来说就是静态需要我们自己去写一个一个的代理对象,而动态就是通过某种技术动态批量生成一批对象的代理对象。

  • 静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
  • 静态代理事先知道要代理的是什么,而动态代理不知道要具体代理哪些对象,只有在运行时才知道。
  • 静态代理有可能存在多个代理 引起"类爆炸",因为需要一个个创建代理对象,而动态代理不会。
  • 动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。它会根据需要,通过反射机制在程序运行期,动态的为目标对象创建代理对象,无需程序员手动编写它的源代码。

动态代理技术又分为:JDK动态代理和CGLIB。

  • JDK动态代理是实现InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。
  • CGLIB动态代理,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。通过在运行时,动态修改字节码达到修改类的目的。

3  静态代理入门

我们本节先从静态代理入门,了解一下一个静态代理的基础实现。实现静态代理有四个步骤:

  1. 定义业务接口UserService;
  2. 实现业务接口UserServiceImpl;
  3. 定义代理类并实现业务接口UserServiceProxy;
  4. 使用代理类完成业务。
/**
 * @author: xjx
 * @description
 */
public interface UserService {

    public void addUser();

}
public class UserServiceImpl implements UserService {

    @Override
    public void addUser() {
        System.out.println("我新增了一个用户");
    }

}
public class UserServiceProxy implements UserService {

    // 代理类中持有原始对象的引用
    private UserService userService;

    public UserServiceProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void addUser() {
        System.out.println("前置操作");
        // 调用原始对象
        userService.addUser();
        System.out.println("后置操作");
    }
}
public class Client {

    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserServiceProxy proxy = new UserServiceProxy(userService);
        proxy.addUser();
    }
}

4  小结

代理的相关知识就先介绍到这里,我们也从静态代理尝试体会一下代理的味道,下节我们开始结合源码详细讲解JDK动态代理和CGLIB的实现过程。

 

标签:对象,代理,导读,源码,userService,UserService,动态,public
From: https://www.cnblogs.com/kukuxjx/p/17137988.html

相关文章

  • VPP 2110版本源码编译安装
    原文地址:https://www.cnblogs.com/liqinglucky/p/vpp.html一介绍官方文档:VPP/WhatisVPP?-fd.ioVPP平台是一个提供了交换机/路由器(switch/router)开箱即用(out-of......
  • 集群机制:注册表同步以及高可用源码剖析
    1在完成服务注册之后,会将注册信息同步给群里中的其他节点,以实现高可用,续约,服务更新,下线都是一样的操作2拿到集群中其他节点的url信息,同步数据3执行批处理任务,ba......
  • 多级缓存机制(包括缓存的主动过期、定时过期、被动过期)源码剖析
    1多级缓存入口2初始化缓存3二级缓存(读写缓存)readWriteCacheMap,每隔180s就会主动过期4一级缓存(只读缓存)readOnlyCacheMap,每隔30s自动刷新一次(定时过期)5......
  • java基础 -- 反射深入浅出与CLass源码解析
    java反射在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的......
  • 框架源码 -- spring aware
    框架源码–springawarebean实现了Aware系列接口可以访问Spring容器,其中涉及到bean的创建过程,其中包括BeanNameAware,BeanFactoryAware,ApplicationContextAware都有参与b......
  • 自动故障感知以及服务实例自动摘除源码剖析
    1每隔1min调度一次EvictionTask这个任务,感知是否有实例故障,并摘除eureka-server初始化完成,进入下面这个方法registry.openForTraffic(applicationInfoManager,regist......
  • 2-1-4.spring源码--AbstractApplicationContext
    Spring源码–AbstractApplicationContext概述江湖上流传这样一个传说,只要把spring的refresh()搞明白,spring就学的七七八八了。今天来盘一下refresh方法,这个这是一个困难点了......
  • 服务下线源码剖析
    1client正常下线之前,会调用这个关闭的方法2释放线程池等资源3将实例状态设置为down,发送http请求调用server的cancel()方法4释放网络等资源......
  • 如何在eclipse上查看源码,如果在idea查看源码【待完善】
    如何查看源码目录文章目录​​如何查看源码目录​​​​如何在eclipse上查看String的源码目录​​​​如何在idea上查看String的源码目录【待完善】​​如何在eclipse上查看......
  • client启动过程源码剖析
    1实例化EurekaInstanceConfig对象instanceConfig2先初始化InstanceInfo对象,再基于构建好的instanceConfig和instanceInfo构建applicationInfoManager对象3......