业界动态
dao接口有什么好处_IoC 和 AOP 到底是什么?
2024-11-26 00:23

dao接口有什么好处_IoC 和 AOP 到底是什么?

8bc03416d5cfcfa82917ecabc2296b17.png

面试也好,学习的技术知识点也好,IoC和AOP都是很重要的东西,这篇文章就给大家一次性彻底讲清这个技术知识点。

IoC (Inversion of control )控制反转/反转控制。它是一种思想不是一个技术实现。描述的是:Java 开发领域对象的创建以及管理的问题。

例如:现有类 A 依赖于类 B

  • 传统的开发方式 :往往是在类 A 中手动通过 new 关键字来 new 一个 B 的对象出来
  • 使用 IoC 思想的开发方:不通过 new 关键字来创建对象,而是通过 IoC 容器(Spring 框架)来帮助我们实例化对象。我们需要哪个对象,直接从 IoC 容器里面过去即可。

从以上两种开发方式的对比来看:我们 “丧失了一个权力” (创建、管理对象的权力),从而也得到了一个好处(不用再考虑对象的创建、管理等一系列的事情

控制 :指的是对象创建(实例化、管理)的权力

反转 :控制权交给外部环境(Spring 框架、IoC 容器

09b0624ca1905c4faebdc9a019409100.png

IoC 的思想就是两方之间不互相依赖,由第三方容器来管理相关资源。这样有什么好处呢

  1. 对象之间的耦合度或者说依赖程度降低
  2. 资源变的容易管理;比如你用 Spring 容器提供的话很容易就可以实现一个单例。

例如:现有一个针对 User 的操作,利用 Service 和 Dao 两层结构进行开发

在没有使用 IoC 思想的情况下,Service 层想要使用 Dao 层的具体实现的话,需要通过 new 关键字在UserServiceImpl 中手动 new 出 IUserDao 的具体实现类 UserDaoImpl(不能直接 new 接口类)。

cb60997b3801bc4edf923dfc00ed30f3.png

很完美,这种方式也是可以实现的,但是我们想象一下如下场景

开发过程中突然接到一个新的需求,针对对IUserDao 接口开发出另一个具体实现类。因为 Server 层依赖了IUserDao的具体实现,所以我们需要修改UserServiceImpl中 new 的对象。如果只有一个类引用了IUserDao的具体实现,可能觉得还好,修改起来也不是很费力气,但是如果有许许多多的地方都引用了IUserDao的具体实现的话,一旦需要更换IUserDao 的实现方式,那修改起来将会非常的头疼。

bc84923561c2028085e4f145430bb9d8.png

使用 IoC 的思想,我们将对象的控制权(创建、管理)交有 IoC 容器去管理,我们在使用的时候直接向 IoC 容器 “要” 就可以了。

IoC(Inverse of Control:控制反转)是一种设计思想 或者说是某种模式。这个设计思想就是 将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。 IoC 在其他语言中也有应用,并非 Spring 特有。IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

IoC 最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,简称 DI)。

并且,Martin Fowler在一篇文章中提到将 IoC 改名为 DI,原文如下。

aef97b1eea4c871fb328cdf4317f0941.png

老马的大概意思是 IoC 太普遍并且不表意,很多人会因此而迷惑,所以,使用 DI 来精确指名这个模式比较好。

AOP:Aspect oriented programming 面向切面编程,AOP 是 OOP(面向对象编程)的一种延续。

下面我们先看一个 OOP 的例子。

例如:现有三个类,Horse、Pig、Dog,这三个类中都有 eat 和 run 两个方法。

通过 OOP 思想中的继承,我们可以提取出一个 Animal 的父类,然后将 eat 和 run 方法放入父类中,Horse、Pig、Dog通过继承Animal类即可自动获得 eat() 和 run() 方法。这样将会少些很多重复的代码。

fa71c6bc30b4e4a83f370f861ca1e86b.png

OOP 编程思想可以解决大部分的代码重复问题。但是有一些问题是处理不了的。比如在父类 Animal 中的多个方法的相同位置出现了重复的代码,OOP 就解决不了。

public class Animal {

private String height;

private double weight;

public void eat() {

// 性能监控代码

long start = System.currentTimeMillis();

// 业务逻辑代码

System.out.println("I can eat...");

// 性能监控代码

System.out.println("执行时长" + (System.currentTimeMillis() - start)/1000f + "s");

}

public void run() {

// 性能监控代码

long start = System.currentTimeMillis();

// 业务逻辑代码

System.out.println("I can run...");

// 性能监控代码

System.out.println("执行时长" + (System.currentTimeMillis() - start)/1000f + "s");

}

}

这部分重复的代码,一般统称为 横切逻辑代码。

1a3255775c5f9489f9375b234fbe92c3.png

横切逻辑代码存在的问题

  • 代码重复问题
  • 横切逻辑代码和业务代码混杂在一起,代码臃肿,不变维护

AOP 就是用来解决这些问题的

AOP 另辟蹊径,提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离

aeb2e0e6c4c9ac87a2d64da7d04cfdb8.png

代码拆分比较容易,难的是如何在不改变原有业务逻辑的情况下,悄无声息的将横向逻辑代码应用到原有的业务逻辑中,达到和原来一样的效果。

通过上面的分析可以发现,AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

:指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑

:横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念。

    以上就是本篇文章【dao接口有什么好处_IoC 和 AOP 到底是什么?】的全部内容了,欢迎阅览 ! 文章地址:http://xiaoguoguo.dbeile.cn/news/1323.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 多贝乐移动站 http://xiaoguoguo.dbeile.cn/mobile/ , 查看更多   
最新新闻
少看手机多看书(少看手机多看书的句子)
  《少看手机多看书》  随着科技的快速发展,手机已经成为了我们日常生活中不可或缺的一部分。然而,我们也不得不面对一个问
手机可以飞机托运吗(手机可不可以飞机托运)
  关于《手机可以飞机托运吗》的探讨  随着科技的快速发展,手机已成为我们日常生活中不可或缺的一部分。当我们旅行、出差或
华为手机内存(华为手机内存可以扩大吗)
  华为手机内存:技术革新与用户体验的完美结合  随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的一部分。在众
5g手机天线(5g手机天线图片)
  关于《5G手机天线》的文章  随着科技的飞速发展,5G时代已经来临,而在这个时代中,手机天线作为接收和发送信号的重要部分
手机号码找回(手机号码找回苹果id密码)
  关于手机号码找回的重要性及其方法  在现代社会,手机号码已经成为我们日常生活中不可或缺的一部分,它不仅是社交联系的关
微信不能解绑手机号(微信手机号怎么解绑)
  微信不能解绑手机号的困扰与解决策略  随着移动互联网的普及,微信已成为人们日常生活中不可或缺的社交工具。然而,一些用
收藏这篇,解锁五一小长假N种玩法!
TRAVEL五一出游攻略奔赴山海,即刻出发即将开启,秦皇岛文旅活动火力全开!从长城脚下的非遗盛宴到碧海蓝天的亲子乐园,从光影交
适合“五一”假期做的30件小事(上)
马上就是五一假期啦别再纠结是出门游玩还是宅家躺平商小编为您整理了这份《五一假期的30件小事清单》直接让你的假期赢麻!从汉服
原创央八开播!12集警匪大剧来袭!秦昊主演,4位实力派助阵,能火
予方聊生活森林中迷雾笼罩,在押犯徐文国(韩庚饰)、姚斌彬(史彭元饰)拼命向森林深处跑。夜色中,杜湘东(秦昊饰)等看守以手
五一来珏山看非遗—空中飞狮、飞人火壶震撼上演...
五一小长假已向我们走来了5天连休的“Plus”模式你的旅游之魂蠢蠢欲动了吗赶快安排组队!珏山宠粉福利五一优惠套票