Java中静态代理的使用与原理详解

 更新时间:2023年09月20日 09:42:56   作者:流烟默  
这篇文章主要介绍了Java中静态代理的使用与原理详解,代理模式是为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能,需要的朋友可以参考下

概述

代理模式是为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象

代理模式有不同的形式, 主要有三种静态代理、动态代理(JDK 代理、接口代理)和Cglib 代理(可以在内存 动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。

应用案例

① 代码实现

具体要求

  • 定义一个接口:ITeacherDao
  • 目标对象TeacherDAO 实现接口ITeacherDAO
  • 使用静态代理方式,就需要在代理对象TeacherDAOProxy 中也实现ITeacherDAO
  • 调用的时候通过调用代理对象的方法来调用目标对象.
  • 特别提醒:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法
public interface ITeacherDao {
	void teach(); // 授课的方法
}
public class TeacherDao implements ITeacherDao {
	@Override
	public void teach() {
		System.out.println(" 老师授课中  。。。。。");
	}
}
//代理对象,静态代理
public class TeacherDaoProxy implements ITeacherDao{
	private ITeacherDao target; // 目标对象,通过接口来聚合
	//构造器
	public TeacherDaoProxy(ITeacherDao target) {
		this.target = target;
	}
	@Override
	public void teach() {
		System.out.println("开始代理  完成某些操作。。。。。 ");//方法
		target.teach();
		System.out.println("提交。。。。。");//方法
	}
}
//测试客户端
public class Client {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建目标对象(被代理对象)
		TeacherDao teacherDao = new TeacherDao();
		//创建代理对象, 同时将被代理对象传递给代理对象
		TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
		//通过代理对象,调用到被代理对象的方法
		//即:执行的是代理对象的方法,代理对象再去调用目标对象的方法 
		teacherDaoProxy.teach();
	}
}

② UML类图

在这里插入图片描述

③ 静态代理的优缺点

优点:在不修改目标对象的功能前提下, 能通过代理对象对目标功能扩展

缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类

一旦接口增加方法,目标对象与代理对象都要维护

到此这篇关于Java中静态代理的使用与原理详解的文章就介绍到这了,更多相关Java静态代理原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java SM2加密相关实现与简单原理详解

    Java SM2加密相关实现与简单原理详解

    SM2算法可以用较少的计算能力提供比RSA算法更高的安全强度,而所需的密钥长度却远比RSA算法低,这篇文章主要给大家介绍了关于Java SM2加密相关实现与简单原理的相关资料,需要的朋友可以参考下
    2024-01-01
  • SpringBoot调用第三方WebService接口的操作技巧(.wsdl与.asmx类型)

    SpringBoot调用第三方WebService接口的操作技巧(.wsdl与.asmx类型)

    这篇文章主要介绍了SpringBoot调第三方WebService接口的操作代码(.wsdl与.asmx类型 ),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • java集合类ArrayList和Vector的区别面试精讲

    java集合类ArrayList和Vector的区别面试精讲

    这篇文章主要为大家介绍了java集合类ArrayList和Vector的区别面试全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 介绍下Java Spring的核心接口,容器中Bean的实例化

    介绍下Java Spring的核心接口,容器中Bean的实例化

    这篇文章主要介绍了Spring核心接口,容器中bean的实例化过程解析及完整代码示例,简单分析实例化bean过程并且分享了相关实例,具有一定借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 解决MyBatisPlus的updateBatchById()批量修改失效问题

    解决MyBatisPlus的updateBatchById()批量修改失效问题

    这篇文章主要介绍了解决MyBatisPlus的updateBatchById()批量修改失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • mybatis实现获取入参是List和Map的取值

    mybatis实现获取入参是List和Map的取值

    这篇文章主要介绍了mybatis实现获取入参是List和Map的取值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Storm框架整合springboot的方法

    Storm框架整合springboot的方法

    Storm框架中的每个Spout和Bolt都相当于独立的应用,Strom在启动spout和bolt时提供了一个open方法(spout)和prepare方法(bolt)。这篇文章主要介绍了Storm框架整合springboot的方法,需要的朋友可以参考下
    2018-11-11
  • 解决springboot引入swagger2不生效问题

    解决springboot引入swagger2不生效问题

    这篇文章主要为大家介绍了解决springboot引入swagger2不生效问题的方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • mybatis if test 不为空字符串或null的解决

    mybatis if test 不为空字符串或null的解决

    这篇文章主要介绍了mybatis if test 不为空字符串或null的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MyBatis执行批处理操作的实现示例

    MyBatis执行批处理操作的实现示例

    在MyBatis中,批处理操作是一种高效执行多条语句的方式,下面就来介绍一下MyBatis执行批处理操作的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07

最新评论