2024年最新【SSM框架解析】——前篇:详解动态代理(1),springmvc面试题及答案

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 八、JDK动态代理要求(严格执行)

  • 九、JDK动态代理用到的类和接口

    • **1)Proxy类**

    • **2)Method类**

    • ** 3)InvocationHandler接口 **

  • 十、CGLib动态代理

  • ✨总结


一、代理模式

======================================================================

客户端无法访问目标对象,通过代理对象进行访问,而且增强式访问。

优点:适合进行业务的扩展

举个例子:假如你是学校负责人,现在要举行一个明星演唱会,你需要请明星来学校进行演唱。但是你能直接练习到明星本人吗?不能,只能通过明星经纪人来联系。

那么这里的明星就是目标对象,经纪人就是代理对象。

再想一下,明星那么大的腕,肯定只进行唱歌,即进行主要业务,那么商量时间,地点,费用等等杂事,即业务的扩展

下图以刘德华举例:

在这里插入图片描述

二、代理模式的作用

=========================================================================

1)控制目标对象的访问:对于目标对象不是想访问就能访问的,只能通过代理才能进行访问,这样一来目标对象只需要专注主要业务的实现,而不用关心其他事情。

2)增强功能:代理通过自身调创建目标对象,调用目标对象的主业务方法进行实现主业务,那么在调用的前后都可以增加自己的功能,即增强了功能

三、代理模式的分类

=========================================================================

1)静态代理

2)动态代理,又为JDK动态代理,CGLib动态代理(子类代理)

四、什么是静态代理

=========================================================================

他是代理模式的一种。

它具备一下特点:

  1. 目标对象和代理对象实现同一个业务接口

  2. 目标对象必须实现接口

  3. 代理对象在程序运行前就已经存在

  4. 能够灵活的进行目标对象的切换,却无法进行功能的灵活处理(使用动态代理处理此问题)

五、静态代理实现

========================================================================

案例分析:

业务功能:请明星进行节目表演.

明星刘德华:目标对象(无法直接访问)

刘德华助理:代理对象(我们可以访问,他还可以跟明星对接)

我们 :客户端对象


 代码实现

  业务接口Service

  public interface Service {

    //规定的唱歌的业务功能

    void sing();

  }



  目标对象:

	/**

	 *   目标对象:刘德华,实现业务接口中的功能,进行唱歌表演

	 */

	public class SuperStarLiu implements Service {

	    @Override

	    public void sing() {

	        System.out.println("我是刘德华,我正在表演唱歌............");

	    }

	}

  

  代理对象:

	    public class Agent implements Service {



    //类中的成员变量设计为接口

    public Service target;  //目标对象



    //传入目标对象,方法的参数设计为接口

    public Agent(Service target){

        this.target = target;

    }



    @Override

    public void sing() {

        System.out.println("预订时间..........");

        System.out.println("预订场地..........");



        //切记切记:业务功能必须由目标对象亲自实现

//        SuperStarLiu liu = new SuperStarLiu();

//        liu.sing();

//

//        SuperStarZhou zhou = new SuperStarZhou();

//        zhou.sing();



        //面向接口编程:调用时,接口指向实现类

        target.sing();



        System.out.println("结算费用..........");

    }

}



  客户端对象

   @Test

    public void testAgent(){

    //测试功能

	//        SuperStarLiu liu = new SuperStarLiu();

	//        liu.sing();



	//        Agent agent = new Agent();

	//        agent.sing();



	        //有接口和实现类,必须使用接口指向实现类(规范)

	        Service agent = new Agent();

	        agent.sing();

	    }



六、面向接口编程(重要)

============================================================================

  • 类中的成员变量设计为接口

//类中的成员变量设计为接口

    public Service target;  //目标对象



  • 方法的形参设计为接口

//传入目标对象,方法的参数设计为接口

    public Agent(Service target){

        this.target = target;

    }



  • 方法的返回值设计为接口

    本例子暂时还未涉及,后面文章将涉及到。

  • 调用时接口指向实现类


//有接口和实现类,必须使用接口指向实现类(规范)

	        Service agent = new Agent();



七、动态代理

======================================================================

可以看出,静态代理有个问题,如果我们需要扩展主要功能,即添加Service接口中的业务,那么我们同时需要在目标对象和代理对象的类中实现该方法。

例子,如果我们想看刘德华跳舞,(他也带愿意,假设愿意…),那么首先刘德华要愿意,实现跳舞,同时也要告诉经纪人刘德华可以跳舞才可以,这样一来我们就需要改动已经写好的源码,比较麻烦。这时动态代理就比较好的解决了这个问题。

代理对象在程序运行的过程中动态在内存构建.可以灵活的进行业务功能的切换.

八、JDK动态代理要求(严格执行)

=================================================================================

  1. 目标对象必须实现业务接口
  1. JDK代理对象不需要实现业务接口
  1. JDK动态代理的对象在程序运行前不存在.在程序运行时动态的在内存中构建
  1. JDK动态代理灵活的进行业务功能的切换
  1. 本类中的方法(非接口中的方法)不能被代理

九、JDK动态代理用到的类和接口

================================================================================

它是使用现在的工具类完成JDK动态实现.

1)Proxy类


它是java.lang.reflect.Proxy包下的类. 它有一个方法Proxy.newProxyInstance(…)专门用来生成动态代理对象.


public static Object newProxyInstance(ClassLoader loader,  //类加载器

                                        Class<?>[] interfaces,//目标对象实现的所有接口

                                       InvocationHandler h //它就类似于Agent的功能,代理的功能和目标对象的业务功能调用在这

                                          )

        throws IllegalArgumentException

    {...}



2)Method类


**反射用的类,用来进行目标对象的方法的反射调用.

method对象接住我们正在调用的方法sing(),show()**

总结

这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家

在这里插入图片描述

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

调用.

method对象接住我们正在调用的方法sing(),show()**

总结

这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家

[外链图片转存中…(img-Lbp7UYnz-1715232392646)]

[外链图片转存中…(img-LhTI6euL-1715232392646)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值