概述Spring中的代理设计详解静态代理为后续Spring的Aop和动态代理做概念铺垫

超、凢脫俗 2024-05-24 12:49 86阅读 0赞

053765fa2bbb4b788f4e1e381d3096e4.jpeg

?? 学习交流群:

✅✅1:这是孙哥suns给大家的福利!

✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring…应用和源码级别的视频资料

??3:QQ群:583783824?? 工作微信:BigTreeJava 拉你进微信群,免费领取!

??4:本文章内容出自上述:Spring应用课程!??

??5:以上内容,进群免费领取呦~ ????

一:代理设计模式

Spring的IOC当中封装了工厂模式,Spring的Aop当中封装了代理模式。静态代理设计模式 + 动态代理设计模式

1:几个前瞻问题

在JavaEE分层的开发过程中,哪个层次对我我们来讲是最重要的?
Controller,Service,dao层?那个层次最重要呢?任何一个项目,任何一行代码都是为了满足用户的需求,就是Service层的业务操作,只有Service层才是真正满足用户需求的,dao是满足Service实现业务处理的,主体是Service层。在JavaEE分层开发中最为重要的Service层。

Service关键操作有哪些?
DAO的调用、事务相关操作。

另外就是额外功能也是Service层当中的业务,不属于核心业务,不具备业务功能,是可有可无的,代码量比较少,根核心功能做对比,这样的代码叫做附加功能的代码。
比方说:Service加事务?客户在组需求分析的时候不会控制事务的这个东西,在查询操作当中事务就是可无的,然而其他的东西,日志也是附加功能。
日志:记录,谁时间,什么事,结果,所谓的日志就是记录(用户,系统,spring)操作的流水账,比方说可以记录启动时spring的都干了点啥,比方说可以记录用户对系统所有的操作,搞一个这样的日志管理系统,结合Elk非常完美。重要操作需要记录这个信息,浏览这个上篇就是没有这么重要了。

性能监控功能,在开发过程中,看一下我们的这个业务操作用了多长时间,监控一下核心业务的性能,记录一个开始时间,记录一个结束时间,做一个差值就完事,这个性能监控也是一个操作。

service层是对我们来讲是很重要的,一个是核心功能,一个是额外功能,核心功能就是:业务运算+dao的调用,额外功能不属于业务,可有可无,代码量很小。

额外功能书写在Service层当中到底好不好?

额外功能写在Service层当中,到底好不好?站在Service层调用者来讲,Controller对于事务来讲肯定需要,保证数据的保证业务的完整性,数据的一致性,软件设计者角度Service当中不需要这些额外的功能,额外功能是可有可无的,不希望在Service层当中加入这块内容。

2:生活中的解决方案

房东不想张贴广告带着看房,执行签合同收钱。租客想看到广告在去看房
解决方法:中介—proxy(代理)这是中介代理的一个角色,广告和看房交由中介来干。

中介的方法名必须和房东的方法名保持一致,这意味着非核心的功能都交由代理来做,这意味着之间的调用关系也发生改变了,不再是租客调用房东,而是租客调用代理,而这个签合同和收钱这个操作租户是没有办法进行操作的,需要房东进行操作,所以代理在调用房东的方法就可以了,代理的方法名需要和房东的方法名完全一样,哪天对中介的这个业务不满意了,我们需要修改该中介的代码不满意了,不需要该中介的代码,只需要创建一个新的中介公司就可以了,核心功能可以稳定下来。好处在于附加功能不满意的时候不需要该,换个新的就可以了。

我们解决问题的方式:引入了一个代理类,调用了我们的目标类,使用了原始类的核心功能。

3:代理设计模式

(一):什么是代理设计模式

通过代理类为原始类增加额外的功能,我们要想为他增加日志事务这些额外的功能,就要加代理类, 好处利于原始类的维护

(二):关键名词解释

目标类&&原始类:实际上就是我们的房东,指的也就是我们的业务类,它做的是核心运算和dao的调用

目标方法&&原始方法:目标类,原始类中的方法就是原始类和原始方法。

额外功能&&附加功能:主要以日志、事务、性能为代表,以代理类利于维护。

(三):代理开发的核心要素

代理类: 目标类(原始类)、额外功能、和原始类实现相同的接口(中介所提供的方法和房东提供的方法必须一一对应,房东对应的userService,把这个生命成接口,日后这些方法都只完成业务运算和dao的调用)我们日后所开发的代理的中介类必须保证和目标方法已知,也得实现userService这个接口,来保证具有相同的方法,也即是说代理类必须和目标类实现相同的接口,这样的目的是为了二者的方法保持一致

4:静态代理的开发

  1. public class UserServciceProxy implements UserService {
  2. private UserServiceImpl userService = new UserServiceImpl();
  3. @Override
  4. public void register(User user) {
  5. System.out.println("----log日志---");
  6. userService.register(user);
  7. }
  8. @Override
  9. public boolean login(String name, String Password) {
  10. System.out.println("-------log日志----------");
  11. return userService.login(name,Password);
  12. }
  13. }

5:静态代理的缺陷

代理类最后的展现的结构是很相似的,都是在代理类当中实现了额外的功能又调用了原始的方法。
现在编写测试类进行测试,调用的应该调用代理类。
b8301b083ebb405f8e8eb46305acc1b7.png
需要注意的是:我们现在应用的这个代理叫做静态代理类。特点就是有一个原始类就必须有一个代理类,都需要手工编写一个代理类。

静态代理存的问题?
存在的项文件过多,不利于项目管理。
额外功能维护性差,额外功能繁杂

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读