Java代理之静态代理
什么是代理
代理就是给目标对象一个代理对象,并由代理对象控制目标的引用。
为什么要使用代理模式
1、通过引入代理对象的方式,可以间接的访问目标对象,避免直接访问目标对象给系统带来不必要的复杂性。
2、通过代理对象可以对原有的业务进行业务增强处理。
举例:如果我们需要买国外的某一件商品A,这个时候我们一般有两个途径要么直接去国外买,要么可以找一些代购人员帮我们去购买。在这种情况下,我们由于直接去国外买,实在是太耗软妹币,而且还要花时间等等,这个时候我们最优的选择就是找代购购买,这样也帮我们省去了很多麻烦的事情。

代理模式类图

代码示例
抽象对象:
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);
}
}
测试结果:

我们可以在代码示例中清晰的看到,在代理类中,代理对象包含了目标对象,并且在业务处理上进行了一定的业务扩展,但是却和目标对象继承于同一个接口。但是此扩展基于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);
}
}
结果:

我们可以看到,在实现业务扩展的时候,需要对原有的代理类进行修改,如果后期我们需要扩展的业务较多的时候,这个类将变的更加繁杂,大量的继承以及方法重写,以至于牵一发而动全身,所以在这种业务扩展性高、业务变化频繁的情况下我们不建议使用静态代理。
静态代理总结:
1、违反Java设计模式开闭原则,即:程序对外扩展开放,对修改关闭。当需求进行变更时,我们应该是新增代码块来实现,而不是在原来的代码中进行修改实现。
2、扩展性很差。
3、可维护性差。
4、代码耦合度高。
如果觉着不错可以关注公众号:Java秃头猿,专注于项目实际开发技术分享。

Java代理之静态代理的更多相关文章
- Java代理模式/静态代理/动态代理
代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...
- 【Java】代处理?代理模式 - 静态代理,动态代理
>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...
- Java代理模式——静态代理模式
一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...
- 黑马程序员:Java基础总结----静态代理模式&动态代理
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...
- Java中的代理模式--静态代理和动态代理本质理解
代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...
- JAVA设计模式——代理(静态代理)
定义 为其它的对象提供一种代理,以控制这个对象的访问 使用场景 当不想直接访问某个对象的时候,就可以通过代理 1.不想买午餐,同事帮忙带 2.买车不用去厂里,去4s店 3.去代理点买火车票,不用去车站 ...
- java代理:静态代理和动态代理
一.Java中有一个设计模式是代理模式 代理模式是常用的Java设计模式,特征是代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类 ...
- java 基础 --- 动态代理和静态代理
问题 : 代理的应用场景是什么 动态代理的底层原理是什么,为什么只能继承接口 概述 代理模式是设计模式的一种,简单地说就是调用代理类的方法实际就是调用真实类的方法.这种模式在AOP (切面编程)中非 ...
- Java中的静态代理实现方式
1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...
随机推荐
- Python监控你的女朋友/男朋友每天都在看哪些网站
需求: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提 ...
- Linux安装python 3
方法: 1.官网下载地址:http://www.python.org/download/ 2.rz -y 上传到Linux 解压tar -xvzf Python-3.5.1.tgz 进入目录 ...
- cocos-2d解决rapidjson的string参数转换
解决方法 AddMember的传入的参数不是string, 所以会报错 本质就是把string类型转换成 参数的类型 username = "string"; rapidjson: ...
- 思维导图概览SpringCloud
@ 目录 1.什么是微服务 1.1.架构演进 1.2.微服务架构 1.3.微服务解决方案 2.SpringCloud概览 2.1.什么是SpringCloud 2.1.SpringCloud主要组件 ...
- 剑指Offer——II平衡二叉树
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None # 这道题使用中序遍历加上 ...
- day11面向对象 多态 静态方法 (三)
多继承 class 类名(父类1,父类2) ----- 默认使用第一个父类 重写父类方法 方法名和父类方法名一样 当父类和子类的方法名重名时,默认使用的是子类中的方法 调用被重写的父类的 ...
- 微信小程序setData局部刷新列表
利用setData局部刷新列表 当列表管理加载到第几页时,这个list的数据有十几条的,如果重新setData的话就要重新刷新和渲染列表, 这是个比较麻烦的事,当数据量大时,就会造成白屏, 这时就要局 ...
- 基于OpenSIPS 实现分机注册服务服务器
呼叫中心平台中坐席是不可或缺的一环,而坐席打电话自然需要使用办公分机.通常情况下我们通过软交换平台FreeSWITCH.Asterisk即可搭建分机注册服务. 但单台FreeSWITCH或Asteri ...
- Arraylist的源码学习
@ 目录 ArrayList简介 ArrayList核心源码 ArrayList源码分析 System.arraycopy()和Arrays.copyOf()方法 两者联系与区别 ArrayList ...
- cni-ipam-etcd demo
链接:https://github.com/jeremyxu2010/cni-ipam-etcd 测试demo: package main import ( "fmt" " ...