ioc和aop的原理面试面试aop与ioc原理怎样答最好aop和ioc原理面试题




ioc和aop的原理面试面试aop与ioc原理怎样答最好aop和ioc原理面试题

2022-07-21 2:24:30 网络知识 官方管理员


这篇文章会从下面从以下几个问题展开对IoC&AOP的解释

  • 什么是IoC?
  • IoC解决了什么问题?
  • IoC和DI的区别?
  • 什么是AOP?
  • AOP解决了什么问题?
  • AOP为什么叫做切面编程?

首先声明:IoC&AOP不是Spring提出来的,它们在Spring之前其实已经存在了,只不过当时更加偏向于理论。Spring在技术层次将这两个思想进行了很好的实现。

什么是IoC

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

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

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

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

为什么叫控制反转

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

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

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(1)

IoC解决了什么问题

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

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

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

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

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(2)

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

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

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(3)

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

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(4)

IoC和DI别再傻傻分不清楚

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

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

并且,老马(MartinFowler)在一篇文章中提到将IoC改名为DI,原文如下,原文地址:https://martinfowler.com/articles/injection.html。

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(5)

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

什么是AOP

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

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

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

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

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(6)

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

/***动物父类*/publicclassAnimal{/**身高*/privateStringheight;/**体重*/privatedoubleweight;publicvoideat(){//性能监控代码longstart=System.currentTimeMillis();//业务逻辑代码System.out.println("Icaneat...");//性能监控代码System.out.println("执行时长:"+(System.currentTimeMillis()-start)/1000f+"s");}publicvoidrun(){//性能监控代码longstart=System.currentTimeMillis();//业务逻辑代码System.out.println("Icanrun...");//性能监控代码System.out.println("执行时长:"+(System.currentTimeMillis()-start)/1000f+"s");}}

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

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(7)

横切逻辑代码存在的问题:

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

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

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

ioc和aop的原理面试(面试aop与ioc原理怎样答最好)(8)

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

AOP解决了什么问题

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

AOP为什么叫面向切面编程

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

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

发表评论:

最近发表
网站分类
标签列表