业界动态
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/ , 查看更多   
最新新闻
手机热点不稳定(手机热点不稳定,总是断开)
  关于手机热点不稳定的问题  一、引言  随着移动互联网的普及,手机热点已成为我们日常生活中重要的网络接入方式之一。然
手机自动检测(手机自动检测在哪里)
  关于手机自动检测的文章  随着科技的飞速发展,智能手机已经成为我们日常生活中不可或缺的一部分。为了更好地服务用户,手
手机流量包(如何购买联通手机流量包)
  关于《手机流量包》的文章  随着移动互联网的普及,手机流量已经成为我们日常生活中不可或缺的一部分。为了满足不同用户的
手机桌面宠(手机桌面宠物软件)
  文章标题:《手机桌面宠:一种全新的数字伴侣体验》  随着科技的快速发展,智能手机已经渗透到我们日常生活的方方面面。在
怎样清理手机壳(怎样清理手机壳周围的黑)
  《怎样清理手机壳》  随着智能手机的普及,手机壳成为了保护手机不可或缺的一部分。然而,长时间使用会导致手机壳变脏或积
3000以下的手机(3000以下的手机实用耐用)
  关于《三千元以下手机》的文章  随着科技的快速发展,智能手机已经成为我们日常生活中不可或缺的一部分。如今,市场上充斥
手机换硬盘(手机换硬盘多少钱)
  关于手机换硬盘的文章  随着科技的快速发展,智能手机已成为我们日常生活中不可或缺的一部分。然而,随着使用时间的增长,
国产折叠手机(国产折叠手机性价比排名)
  国产折叠手机:革新科技与未来展望  随着科技的飞速发展,智能手机作为现代生活的必需品,不断推陈出新。近年来,国产折叠
手机当扫描仪(手机当扫描仪扫描头部数据)
  文章标题:《手机当扫描仪:科技革新下的便捷之选》  随着科技的飞速发展,智能手机的功能已经远远超越了单纯的通话和娱乐
手机怎么与电视投屏(手机怎么与电视投屏?)
  《手机怎么与电视投屏》  随着科技的飞速发展,我们的生活越来越离不开各种智能设备。其中,手机与电视作为家庭娱乐的主要