业界动态
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/ , 查看更多   
最新新闻
李子柒︱停更三年 归来仍是顶流
停更1217天,李子柒以一条“紫漆衣柜”视频重新回归。视频发布当日在抖音播放量破亿,累计获赞数超过500万。截止到2024年11月14
原创2025年是“佛灯火”年,啥预兆?明年是蛇年,年成好吗?
推荐语:2025年是“佛灯火”年,啥预兆?明年是蛇年,年成好吗?2025年,天干地支对应的是乙巳年,被称为“佛灯火年”。这一称谓
李子柒的复出:文化输出还是炒作?
李子柒的复出在网络上引发了广泛的讨论,究竟她在文化输出中扮演了什么角色,是否仅仅是资本运作的产物?长期以来,李子柒以其精
赴日本留学大热!北京哪些学校开设日本项目?
置顶关注哟 和4.5万择校家长一起,随时关注择校信息,记得置顶关注哟! ~ “51上私立“→ 点击右上角“...”→ 点选“设为星标
高考:未来5年,最吃香的6个专业,考生可以参考查阅
很多过来人说,选错专业毁一生。大学选错专业要痛苦四年,很多熬过来的学姐和学长提起自己的专业,满满的都是泪,可见选到对的专
长期赴日生存宝典之:去日本都要带些啥呢?
很多同学是第一次长期出国,去日本要带啥?如何丝滑入境?行李超重怎么断舍离?到了日本怎么生活?……对这类问题可能会倍感棘手
留学必知|日本高等教育学位·院校分类详解(附教育部认可院校名单)
与国内类似,日本的高等教育是从完成初等教育(小学6年)以及中等教育(初中3年,高中3年)这12年之后开始的。留学生可以入学的
中国认可的日本大学有哪些?
这是众多准备前往日本留学的中国学子经常咨询的问题。由于日本高等教育质量极高,其严谨的学术研究精神和实践教育理念深受国际学
100个短缺职业排行来了!这个职业排名第一;女生毕业薪酬最高的24个专业!
长按二维码进入福建省2022年高考群获取最新福建省高考政策信息↓高等教育数据与咨询机构麦克思,就女大学生毕业后的薪酬进行统计
日本留学基本生活指南
【#日本留学# #日本留学基本生活指南#】日本留学是很多学生向往的经历,但在留学期间,如何应对基本生活问题也是需要考虑的。