Java代理深入讲解之静态代理

作者:Mr.栋 时间:2022-10-25 14:56:12 

什么是代理

代理就是给目标对象一个代理对象,并由代理对象控制目标的引用。

为什么要使用代理模式

1、通过引入代理对象的方式,可以间接的访问目标对象,避免直接访问目标对象给系统带来不必要的复杂性。

2、通过代理对象可以对原有的业务进行业务增强处理。

举例:如果我们需要买国外的某一件商品A,这个时候我们一般有两个途径要么直接去国外买,要么可以找一些代购人员帮我们去购买。在这种情况下,我们由于直接去国外买,实在是太耗软妹币,而且还要花时间等等,这个时候我们最优的选择就是找代购购买,这样也帮我们省去了很多麻烦的事情。

Java代理深入讲解之静态代理

代理模式类图

Java代理深入讲解之静态代理

代码示例

抽象对象:


public interface ITargetFactoryService {

void sale(String name);
}

目标对象:


@Slf4j
public class TargetFactoryServiceImpl implements ITargetFactoryService {

@Override
public void sale(String name) {
 log.info(name+"购买了商品A");
}
}

代理对象:


@Slf4j
public class ProxyImpl implements ITargetFactoryService {

public ITargetFactoryService service;

public ProxyImpl(ITargetFactoryService service){
 super();
 this.service = service;
}

@Override
public void sale(String name) {
 before();
 service.sale("代购");
 after();

}

/**
 * 后置增强
 */
private void after() {
 log.info("代购在购买后得到了市场调研结果");
}

/**
 * 前置增强
 */
private void before() {
 log.info("代购在购买前做了市场调研");
}
}

测试类:


@Slf4j
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class})
public class SpsringJdbcApplication {

public static void main(String[] args) {
 TargetFactoryServiceImpl service = new TargetFactoryServiceImpl();
 ProxyImpl proxy = new ProxyImpl(service);
 proxy.sale("代购");
 SpringApplication.run(SpsringJdbcApplication.class, args);
}

}

测试结果:

Java代理深入讲解之静态代理

我们可以在代码示例中清晰的看到,在代理类中,代理对象包含了目标对象,并且在业务处理上进行了一定的业务扩展,但是却和目标对象继承于同一个接口。但是此扩展基于Spring AOP来讲,以更加专业的叫法为前置增强、后置增强。

此类代理便是我们常说的静态代理,静态代理适合在业务比较简单,实现类少,需求变化不频繁,但是却要对原有目标服务对象功能进行扩展,并且不去修改原有服务,这个时候我们就可以选择使用静态代理。

静态代理的缺点

如果此时我们业务需要进行扩展,我们的代购同学在经过市场调研以后,发现商品B更加受大家欢迎,这个时候我们就需要对自己的业务进行扩展了,怎么扩展呢?一起接着往下看。

抽象对象:


public interface ITargetFactoryBService {

void saleB(String name);
}

目标对象:


@Slf4j
public class ITargetFactoryBServiceImpl implements ITargetFactoryBService {

@Override
 public void saleB(String name) {
   log.info(name + "购买了商品B");
 }
}

代理对象:


@Slf4j
public class ProxyTwoImpl implements ITargetFactoryService, ITargetFactoryBService {

public ITargetFactoryService service;

public ITargetFactoryBService bService;

public ProxyTwoImpl(ITargetFactoryService service,ITargetFactoryBService bService){
   super();
   this.service = service;
   this.bService = bService;
 }

@Override
 public void sale(String name) {
   before();
   service.sale("代购");
   after();

}

@Override
 public void saleB(String name) {
   before();
   bService.saleB("代购");
   after();
 }

/**
  * 后置增强
  */
 private void after() {
   log.info("代购在购买后得到了市场调研结果");
 }

/**
  * 前置增强
  */
 private void before() {
   log.info("代购在购买前做了市场调研");
 }

}

测试类:


@Slf4j
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class})
public class SpsringJdbcApplication {

public static void main(String[] args) {
 TargetFactoryServiceImpl service = new TargetFactoryServiceImpl();
 ITargetFactoryBServiceImpl bService = new ITargetFactoryBServiceImpl();
 ProxyTwoImpl proxy2 = new ProxyTwoImpl(service, bService);
 proxy2.sale("代购");
 proxy2.saleB("代购");
 SpringApplication.run(SpsringJdbcApplication.class, args);
}

}

结果:

Java代理深入讲解之静态代理

我们可以看到,在实现业务扩展的时候,需要对原有的代理类进行修改,如果后期我们需要扩展的业务较多的时候,这个类将变的更加繁杂,大量的继承以及方法重写,以至于牵一发而动全身,所以在这种业务扩展性高、业务变化频繁的情况下我们不建议使用静态代理。

静态代理总结:

1、违反Java设计模式开闭原则,即:程序对外扩展开放,对修改关闭。当需求进行变更时,我们应该是新增代码块来实现,而不是在原来的代码中进行修改实现。

2、扩展性很差。

3、可维护性差。

4、代码耦合度高。

来源:https://www.cnblogs.com/staticking/p/13628267.html

标签:java,静态,代理
0
投稿

猜你喜欢

  • C#获取鼠标在listview右键点击单元格的内容方法

    2023-10-26 12:40:47
  • vscode编写latex的方法

    2022-05-21 13:30:52
  • C# 图片格式转换的实例代码

    2023-03-11 13:32:46
  • Android中使用Service实现后台发送邮件功能实例

    2022-01-26 16:56:05
  • java web中 HttpClient模拟浏览器登录后发起请求

    2022-10-27 23:07:05
  • SpringBoot中使用JeecgBoot的Autopoi导出Excel的方法步骤

    2023-03-31 03:38:11
  • 基于java配置nginx获取真实IP代码实例

    2023-07-15 12:32:46
  • 完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题

    2023-07-03 11:27:25
  • 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)

    2023-06-09 18:57:49
  • Java语言中的文件数据流示例详解

    2023-05-12 19:55:29
  • Spring Data JPA 复杂/多条件组合分页查询

    2021-09-06 02:57:55
  • 快速了解c# 结构体

    2022-10-19 05:38:45
  • Java 获取Web项目相对webapp地址的实例

    2022-07-03 17:46:00
  • Android如何基于坐标对View进行模拟点击事件详解

    2021-09-24 06:27:30
  • C#使用SharpZipLib压缩解压文件

    2021-10-27 18:56:21
  • JFinal实现伪静态的方法

    2023-07-17 12:11:37
  • java springmvc实现验证码功能

    2022-09-07 12:12:41
  • java判断回文数示例分享

    2023-03-20 03:18:22
  • Java日常练习题,每天进步一点点(58)

    2021-06-26 01:13:02
  • Java实现显示指定类型的文件

    2021-10-26 11:30:37
  • asp之家 软件编程 m.aspxhome.com