Java - 静态代理
代理的名词
代理对象:增强后的对象
目标对象:被增强的对象
Java代理-静态代理
静态代理包含继承和聚合两种。
1. 继承
代理对象继承目标对象,重写需要增强的方法。
public interface UserDao {void query();
}
import org.springframework.stereotype.Service;@Service
public class UserDaoImpl implements UserDao {@Overridepublic void query() {System.out.println("query db");}
}
public class UserDaoLogImpl extends UserDaoImpl {@Overridepublic void query() {System.out.println("start to query");super.query();System.out.println("end to query");}
}
public class TestApp {public static void main(String[] args) {UserDaoImpl dao2 = new UserDaoLogImpl();dao2.query();}
}
`UserDaoLogImpl`是代理对象,`UserDaoImpl`是目标对象。
代理对象与目标对象时相对的,会根据情况发生变化。`UserDaoLogImpl`以后也会成为目标对象。
2. 聚合
import com.merckgroup.msizing.domain.service.UserDao;public class UserDaoOperateImpl implements UserDao {UserDao userDao;public UserDaoOperateImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("operate - start to query");userDao.query();System.out.println("operate - end to query");}
}
public class TestApp {public static void main(String[] args) {UserDao targetUserDao = new UserDaoImpl();UserDaoOperateImpl userDaoOperate = new UserDaoOperateImpl(targetUserDao);userDaoOperate.query();}
}
运行结果:
operate - start to query
query db
operate - end to query
添加时间代理
public class UserDaoTimeImpl implements UserDao {UserDao userDao;public UserDaoTimeImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("time - start to query");userDao.query();System.out.println("time - end to query");}
}
案例
代理1:对日志代理。A
代理2:对操作代理。B
代理3:对时间代理。C
需求:实现对时间和操作的代理。
需求-方案1:采用链式继承,继承B时添加时间代理,继承C时添加操作代理。(继承)
需求-方案2:采用聚合方式
方案1:比较容易实现
方案2:实例代码
public class UserDaoTimeImpl implements UserDao {UserDao userDao;public UserDaoTimeImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("time - start to query");userDao.query();System.out.println("time - end to query");}
}
public class UserDaoOperateImpl implements UserDao {UserDao userDao;public UserDaoOperateImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("operate - start to query");userDao.query();System.out.println("operate - end to query");}
}
public class TestApp {public static void main(String[] args) {UserDao target = new UserDaoTimeImpl(new UserDaoImpl()); // 对时间UserDao userDaoLog = new UserDaoOperateImpl(target); // 继而对操作userDaoLog.query();}
}
运行结果:
operate - start to query
time - start to query
query db
time - end to query
operate - end to query
结论:使用静态代理时会产生类,继而可能引发类爆炸(继承与聚合皆是如此)。因此,在不确定时尽量减少使用静态代理。
不确定情况:不明确后续的扩展情况,是否需要扩展接口或者扩展接口的程度如何。
Java - 静态代理相关推荐
- Java 静态代理、Java动态代理、CGLIB动态代理
为什么80%的码农都做不了架构师?>>> Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...
- java静态代理与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...
- java静态代理与动态代理简单分析
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...
- Java静态代理、动态代理与CGLib代理
java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...
- 面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!
理解Java动态代理需要对Java的反射机制有一定了解 什么是代理模式# 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象. 例如,购买火 ...
- Java静态代理、动态代理以及CGLIB动态代理
代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用.对于java的代理模式,一般可分为:静态代理.动态代理.以及CGLIB实现动态代理. 对于上述三种代理模式,分别进行说明. ...
- JAVA静态代理与动态代理(JDK和CGLIB)
代理就是有一些工作你不屑于自己做的,或者不方便自己做的,这个时候你就请别人帮你做,拿我最喜欢的偶像坤坤做例子,他开演唱会肯定不会自己收门票,不会自己清场打扫卫生,所以就需要代理来代替他完成一整场演唱会 ...
- Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了
动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...
- 啰里吧嗦式讲解java静态代理动态代理模式
一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于 ...
最新文章
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
- 5G NR - 总体架构与物理层
- POJ 2724 Purifying Machine (二分图匹配)
- C++学习笔记5[函数]
- spring中事务配置的3种方式
- spring boot Redis集成—RedisTemplate
- java 接口中变量修饰符,Java的访问修饰符与变量的作用域讲解
- oracle12c创建pdb用户6,ORACLE12C PDB创建默认表空间和用户语句
- Ubuntu命令行和图形界面选择设置
- ubuntu一键安装LAMP 及一键卸载
- pandas—dropna
- HDU 5900(区间DP)
- attention机制_Seq2seq模型中的 Attention机制
- 暴风激活工具,劫持Chrome浏览器主页
- 如何用python计算行列式_Python入门教程: 计算范德蒙矩阵的行列式
- 制作App,免编程积木式搭建如此之简单
- HCPL3120手册翻译
- uni-app 188修复弹框问题
- CIO40知识星球—天道勤酬
- 设计师专属的导航网站