朵小喵儿|设计模式之动态代理
springAOP , 是相对于java中的面向对象(OOP)的一个概念 。 在面向对象中有一些公共的行为 , 像日志记录 , 权限验证等增强逻辑如果都使用面向对象来做 , 会在每个业务方法中都写上重复的代码 , 造成代码冗余 。
而AOP指的是面向切面编程 , 定义一个切面 , 用切面去切相应的方法 , 就可以织入增强的逻辑 。 相应的方法是指核心的业务逻辑 , 切面逻辑使用代理模式来实现 。
关于AOP的单元测试查看SpringAOP面向切面编程功能测试
什么是代理模式?代理代表某个真实的对象 , 代理提供了对真实对象另外的访问方式——即通过代理对象访问真实对象 。 真实对象又可称目标对象 。
这样做的好处是:可以在目标对象实现的基础上 , 增强额外的功能操作 , 即扩展目标对象的功能 。
涉及到的编程原则就是开闭原则:不要随意去修改别人已经写好的代码或者方法 , 如果需要修改 , 可以通过代理的方式来扩展该方法 。
举个例子:假设我们想邀请一位明星 , 那么并不是直接对接明星 , 而是联系明星的经纪人来达到同样的目的 。 明星就是一个目标对象 , 他只要负责活动中的节目 , 而其他琐碎的事情就交给他的代理人(经纪人)来解决 。 这就是代理思想在现实中的一个例子 。
静态代理静态代理 , 简单点来说就是在程序运行之前 , 代理类和被代理类的关系已经确定 。 静态代理的实现首先要定义一个公共的接口 , 然后代理类和被代理类都实现这个接口 , 如下:
//接口public interface IUserDao {void save();String find();}//目标对象public class UserDao implements IUserDao{ private ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); @Override public void save() {System.out.println("模拟保存用户");concurrentHashMap.put("1", "张三"); } @Override public String find() {System.out.println("模拟查找用户");return concurrentHashMap.get("1"); }}//代理对象public class UserDaoProxy implements IUserDao{ private UserDao ud = new UserDao(); @Override public void save() {System.out.println("代理操作 , 开启事务");//模拟的增强处理ud.save();System.out.println("代理操作 , 关闭事务");//模拟的增强处理 } @Override public String find() {return ud.find(); }}静态代理最大的缺点:我们得为每一个服务创建代理类 , 工作量太大不易管理;同时接口一旦发生改变 , 代理类也得相应修改 。
动态代理在动态代理中我们不再需要再手动的创建代理类 , 我们只需要编写一个动态处理器就可以了 。 真正的代理对象由JDK在运行时为我们动态的来创建 。
JDK动态代理:Java为我们创建了Proxy类 , 动态生成的代理类有一个共同的父类叫Proxy , 我们需要告诉Proxy做什么 。 我们不能像静态代理那样把自己的代码放在Proxy类 , 因为Proxy类不是我们自己创建的 。 Java提供了动态处理器InvocationHandler接口 。
InvocationHandler的工作是响应代理的任何调用 , 它是代理收到方法调用后 , 请求做实际工作的对象 。
JDK实现动态代理 , 是通过Proxy的静态方法newProxyInstance来创建代理对象的 , 该方法有三个参数:
- 小机灵鬼|干货速来!透彻剖析微服务架构设计模式,深入开发Java有奇效
- 朵小喵儿|国产手机,2021年迎来考验,美国企业或将再次入局
- 朵小喵儿|突破旗舰封锁,魅族今年性能旗舰亮新玩法,销量真稳了
- 朵小喵儿|小天才手表背后,是成人世界的焦虑
- 朵小喵儿|主板维修必备!海量主板电路图+CPU程序下载
- 朵小喵儿|如何成为制造大国?曹德旺一语中的:先把“这个”取消再说
- 朵小喵儿|蔚来总部临时办公大楼预计下月启用 位于合肥经开区
- 朵小喵儿|腾讯AI Lab高级研究员宋林峰:图到文本生成任务中的通用型图结构信息保存法
- 朵小喵儿|突发!特朗普政府考虑将国内最大芯片制造商中芯国际列入贸易黑名单
- 朵小喵儿|硬件捡垃圾33期
