上一篇:11-Spring的后置处理器BeanPostProcesses https://blog.csdn.net/fsjwin/article/details/109458672

背景:在我们开发的web过程中我们分为controller、service、dao三层,那么那层最为重要呢?

- 答案是service层。

那么service中有那些内容呢?

-service中的内容分为两块:
1. 站在设计者角度上的核心业务计算逻辑和dao的调用 我们称之为【service核心】
2. 站在业务角度的事务、日志、性能检测、统一异常处理等 我们称之为【service外围】

目前我们研究的对象就是service中的这对矛盾:【service核心】和【service外围】

  • 【service核心】 是必不可少的,
  • 【service外围】 可有可无的,可插拔的。
    基于此,我们有什么办法可以做到service的高内聚和低耦合吗?
    答案是肯定的我们可以使用代理模式来实现。
    到此可能大家有点模糊,没有关系,接着往下看,就会越来越明朗。

1.代理模式

  1. 什么是代理模式
    通过代理为原始类增加额外功能
    好处:有利于目标类的维护,增强的更能是可插拔的。

  2. 名词解释
    目标类:如UserServiceImpl
    目标方法: login(String username,String password)
    额外功能:日志、性能检测、统一异常处理

  3. 代理类和原始类的关系。
    均实现同一个接口,对目标类进行增强。

  4. 具体代码如下
    接口:UserService.java

package proxy.service;/*** @author yuhl* @Date 2020/11/3 9:26* @Classname UserService* @Description TODO*/
public interface UserService {public void login(String username,String password);
}

目标类:OrderServiceImpl.java

package proxy.service.impl;import proxy.service.UserService;/*** @author yuhl* @Date 2020/11/3 9:28* @Classname UserServiceImpl* @Description TODO*/
public class UserServiceImpl implements UserService {@Overridepublic void login(String username, String password) {System.out.println("UserServiceImpl.login 我是【service核心】");}
}

代理类:OrderServiceImplProxy

package proxy.service.impl;import proxy.service.UserService;/*** @author yuhl* @Date 2020/11/3 9:30* @Classname UserServiceImplProxy* @Description TODO*/
public class UserServiceImplProxy implements UserService {//    需要对目标方法进行增强就需要先拿到目标类UserService userService = new UserServiceImpl();@Overridepublic void login(String username, String password) {System.out.println("UserServiceImplProxy.login 【service外围】");userService.login(username,password);}
}

测试:

 @Testpublic void test1() {ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext5.xml");UserService userService = (UserService)ctx.getBean("userService");userService.login("zhangsan","111111");}

结果:

UserServiceImplProxy.login 【service外围】
UserServiceImpl.login 我是【service核心】
  1. 具体代码如下2
    上面是对UserSerivce的静态代理过程,下面又由来个OrderService业务类,我们使用同样的方法
    接口:OrderService .java
package proxy.service;/*** @author yuhl* @Date 2020/11/3 9:37* @Classname OrderService* @Description TODO*/
public interface OrderService {public void order ();
}

目标类:OrderServiceImpl .java

package proxy.service.impl;import proxy.service.OrderService;/*** @author yuhl* @Date 2020/11/3 9:38* @Classname OrderServiceImpl* @Description TODO*/
public class OrderServiceImpl implements OrderService {@Overridepublic void order() {System.out.println("OrderServiceImpl.order 【service核心】");}
}

代理类:OrderServiceImplProxy

package proxy.service.impl;import proxy.service.OrderService;/*** @author yuhl* @Date 2020/11/3 9:39* @Classname OrderServiceImplProxy* @Description TODO*/
public class OrderServiceImplProxy implements OrderService {OrderService orderService = new OrderServiceImpl();@Overridepublic void order() {System.out.println("OrderServiceImplProxy.order 【service外围】");orderService.order();}
}

测试:

 @Testpublic void test2() {ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext5.xml");OrderService userService = (OrderService)ctx.getBean("orderService");userService.order();}

结果:

OrderServiceImplProxy.order 【service外围】
OrderServiceImpl.order 【service核心】
  1. 后面还有100个具体的代码
    怎么办,使用代理,确实可以对原有的目标类进行增强,实质上就是在写一个类,即代理类,这个类也实现目标类的同样的接口,重写接口中的方法,而在发放中自己不写实现,而是调用目标类的方法,另外在调用前后加上子节点外围逻辑即可。。

2.总结

  1. 静态代理有哪些优势:
  • 可以对原有方法进行加强。
  1. 静态代理有哪些劣势:
  • 类会增多一倍,会给类的管理带来难度
  • 类中的冗余代码多,比如目标方法的前置增强逻辑和后置增强逻辑均需要在每一个代理类中写一次。
  1. 有没有更为高明的办法呢?
    有的,可以使用spring的动态代理。

下一篇:13-Spring动态代理 https://blog.csdn.net/fsjwin/article/details/109462904

12-静态代理设计模式-为了引出spring动态代理相关推荐

  1. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  2. 静态代理、JDK与CGLIB动态代理、AOP+IoC原理

    静态代理.JDK与CGLIB动态代理.AOP+IoC 希望大家认真看完,感谢写这文章的大牛 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用 ...

  3. Spring动态代理原理是什么?

    动态代理的两种模式 jdk动态代理    //基于实现接口 Cglib动态代理   //基于方法的继承 ????????啥东西 这就不得不提到 静态代理了: 说得高大上,其实就是写一个增强类继承被增强 ...

  4. 从一个Spring动态代理Bug聊到循环依赖

    文章目录 Bug复现 结论 @PostConstruct的在Bean的生命周期的哪一步 一般代理类的生成时机在生命周期的哪一步 解决办法 两个思路 1.不生成代理类 2.在生成代理类之后再进行数据的初 ...

  5. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  6. 【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?

    Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy? 前言 版本约定 正文 例子测试 结论分析 proxyTargetClass 标识的校正 哪些接口不是 Reas ...

  7. JAVA基础加强篇12——单元测试、反射、注解、动态代理

    单元测试.反射.注解.动态代理 课程安排 单元测试 单元测试概述 单元测试 单元测试就是针对最小的功能单元编写测试代码,Java 程序最小的功能单元是方法,因此,单元测试就是针对 Java 方法的测试 ...

  8. 4、MyBatis + Log4j日志查看Sql参数、结果集元数据、Mapper代理开发、JDK的动态代理与CGLib代理

    文章目录 MyBatis优化开发 日志 ResultSet如何转换为Java对象 数据库元数据 结果集元数据 Fastjson 基于MyBatis的DAO开发(传统) 推荐mapper代理开发 JDK ...

  9. 动态代理的分析以及利用动态代理模式进行敏感词汇过滤

    动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...

  10. 什么是Java动态代理,如何实现一个动态代理例子

    Java动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家"委托"代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背 ...

最新文章

  1. deeplearning URL
  2. hdoj 1285 确定比赛名次 【拓扑排序】
  3. MySQL-线上删除表流程
  4. drool 7.x 属性 : lock-on-active
  5. 使用cmd-命令运行Java项目
  6. python getcwd_Python os.getcwd()方法
  7. 网课查课插件 支持 60类型+ 彩虹查课插件 网络查课查询
  8. 百度地图封装实现拉框效果
  9. 计算机表格两行互换步骤,excel怎么让两行互换位置,EXCEL里两个格的内容怎么互换?...
  10. veil-Evasion免杀使用
  11. Windows10 如何禁用或删除大的Hiberfil.sys和Pagefile.sys文件
  12. vue模块给模块传参_Vue店面的Paypal支付模块
  13. 【STM32】STM32F103C8T6+nrf24l01收发示例
  14. 不拆无损,在北汽EU5,EU7,EX3,EX7安装app应用
  15. 区块链 01(简化后的区块包括父区块哈希值、数据、时间戳、哈希值这四个字段,区块的哈希值由父区块哈希值、数据、时间戳、3个字段拼接通过 哈希算法计算而成)
  16. 支付宝-蚂蚁金服一面
  17. springBoot项目--平台控制商品订单中各商家打印机打印小票--终极版
  18. hc05与单片机连接图_蓝牙模块与单片机如何连接?
  19. 有了这个Python库,再也不愁给孩子起名字了
  20. 整理下 android 保活 防被杀 守护进程

热门文章

  1. 国三 unit3 被动语态
  2. AM5728 + 映美精工业相机图像处理案例
  3. Delphi7--运算符和表达式
  4. 75道经典逻辑思维题及答案
  5. erp系统服务器维护,ERP系统维护服务器维护管理文档模板.doc
  6. m3u8播放器 android,在android中播放m3u8视频
  7. CGAL学习记录——点云密度计算
  8. arcgis地理空间数据库学习记录01-复制地理数据库
  9. Windows系统批量创建文件夹的技巧
  10. 虚拟机客户端访问不了服务器域名,虚拟机ESXI 篇四:让你电脑打开网页不用等待---SmartDns...