老铁们,大家好,相信还有很多朋友对于我在面试中被问过数百次关于IoC 和AOP 的问题,你仍然感到困惑吗?和的相关问题不太懂,没关系,今天就由我来为大家分享分享我在面试中被问过数百次关于IoC 和AOP 的问题,你仍然感到困惑吗?以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
什么是国际奥委会? IoC解决什么问题? IoC 和DI 有什么区别?什么是AOP? AOP解决什么问题?为什么AOP被称为切面编程?
什么是 IoC
IoC(Inversion of control)控制反转/反转控制。这是一个想法而不是技术实现。描述:Java开发领域中对象的创建和管理。
例如:现有的A类依赖于B类
传统的开发方法:往往在A类中,手动使用new关键字创建B的新对象。 使用IoC思维的开发方法:不使用new关键字创建对象,而是使用IoC容器(Spring框架)来帮助我们实例化对象。我们需要哪个对象可以直接从IoC容器传递。从上面两种开发方式的对比来看:我们“失去了一个权力”(创建和管理对象的权力),从而也获得了一个好处(不需要考虑对象的创建和管理等)
为什么叫控制反转
控制:指创建(实例化、管理)对象的权力
反转:控制权交给外部环境(Spring框架、IoC容器)
IoC 解决了什么问题
IoC的思想是两方互不依赖,由第三方容器管理相关资源。这样做有什么好处呢?
对象之间的耦合或依赖程度降低;资源变得更容易管理;例如,如果使用Spring容器,则可以轻松实现单例。例如:现有一个User的操作,采用Service和Dao的两层结构开发。
在不使用IoC思想的情况下,Service层如果想使用Dao层的具体实现,需要通过new关键字手动new UserServiceImpl中IUserDao的具体实现类UserDaoImpl(接口类不能直接new)。
太完美了,这个方法也是可以实现的,但是我们想象一下下面的场景:
在开发过程中,突然接到一个新的需求,又开发了一个IUserDao接口的具体实现类。由于Server层依赖于IUserDao的具体实现,所以我们需要修改UserServiceImpl中的新对象。如果只有一个类引用IUserDao的具体实现,你可能会觉得还可以,修改起来也不是很费力。但是,如果有很多地方引用了IUserDao 的具体实现,一旦需要改变IUserDao 的实现,那么修改起来就会非常头疼。
利用IoC的思想,我们将对象的控制权(创建和管理)交给IoC容器来管理。当我们使用它时,我们可以直接向IoC容器“询问”它。
IoC 和 DI 别再傻傻分不清楚
IoC(Inverse of Control: Inversion of Control)是一种设计思想或者某种模式。设计思想是将程序中手动创建对象的控制权交给Spring框架。 IoC也在其他语言中使用,并不是Spring特有的。 IoC容器是Spring实现IoC的载体。 IoC容器实际上是一个Map(key,value),Map中存储着各种对象。
IoC最常见、最合理的实现方法称为依赖注入(DI)。
而且,Martin Fowler 在一篇文章中提到,IoC 应该更名为DI。原文如下,原文地址:https://martinfowler.com/articles/injection.html。
老马的意思大概是IoC太常见了,不明确,很多人都会被它搞糊涂。因此,最好使用DI来准确命名这种模式。
什么是 AOP
AOP:面向方面编程,AOP是OOP(面向对象编程)的延续。
我们首先看一个OOP 示例。
例如:现有三个类:Horse、Pig 和Dog。这三个类有两个方法:吃和跑。
通过OOP思维中的继承,我们可以提取出一个Animal的父类,然后将eat和run方法放入父类中。 Horse、Pig、Dog可以通过继承Animal类自动获得eat()和run()方法。这将节省大量重复代码。
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+’);}} 这部分重复的代码一般称为横切逻辑代码。
横切逻辑代码的问题:
代码重复的问题是横切的逻辑代码和业务代码混在一起,使得代码臃肿,维护不方便。 AOP就是用来解决这些问题的。
AOP采用了一种新的方法,提出了一种水平抽取机制,将横切逻辑代码和业务逻辑代码分离。
代码拆分相对容易,但难的是如何在不改变原有业务逻辑的情况下,悄悄地将横向逻辑代码应用到原有业务逻辑上,达到与原来一样的效果。
AOP 解决了什么问题
从上面的分析可以发现,AOP主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,从根本上解耦横切逻辑代码,避免交叉的重复- 切割逻辑代码。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/141965.html
用户评论
陌颜幽梦
确实啊,IoC和AOP这两点我在面试里总是被问到,感觉自己答得总是没头没脑的,看完这篇文章,理解了好多!希望下次面试能用得上。
有9位网友表示赞同!
折木
我也是一样,每次面试都遇到这些问题,感觉压力很大,都不知道该怎么答啊。这篇文章写的挺好的,我打算好好地研究一下这两个概念。
有16位网友表示赞同!
◆乱世梦红颜
说来说去还是老话题,但其实IoC和AOP的应用场景确实太多了,需要深入理解才能灵活运用!这篇博文解释的就很生动形象,受益良多!
有18位网友表示赞同!
伱德柔情是我的痛。
我也是面试经历者哈,感觉这篇文章写的深入浅出,对于新手小白来说很友好。特别是关于 IoC 特点部分,给我提了不少感悟,可以更好地去理解它的意义所在!
有5位网友表示赞同!
百合的盛世恋
我觉得作者分析的非常到位,我以前也经常把IoC和AOP搞混淆了,这篇文章帮我理清了思路,以后面试再也不用担心这个问题啦!
有7位网友表示赞同!
生命一旅程
这种博文很有帮助!特别是对于刚开始学习Spring等框架的人来说,确实能帮你理解这两个概念的关键点。不过我觉得文章里可以再多补充一些实例讲解,更容易让人理解。
有12位网友表示赞同!
不浪漫罪名
同意作者的说法,IoC和AOP是很多的面试必问问题,希望以后我能把这些知识点都牢记于心!
有17位网友表示赞同!
她的风骚姿势我学不来
我感觉这个博文还算详细,不过对于新手小白来说,还是需要多看几遍才能完全理解。建议作者可以添加一些动画演示或者代码示例,这样更容易让人理解。
有10位网友表示赞同!
怅惘
我觉得 IoC 和 AOP 这两个概念确实是面试里的 "常客",但只要掌握了他们的原理和应用场景,其实并不难回答问题!这篇文章解读得挺好,能帮助我更好地复习准备。
有17位网友表示赞同!
颓废i
文章总结得不错,但对新手可能并不是太友好。建议增加一些基础知识的讲解,例如什么是面向对象的编程?为了提升学习效率,可以提供一些相关的视频资源或者在线课程推荐。
有17位网友表示赞同!
无关风月
博文很实用,把 IoC 和 AOP 的概念解释得很清楚。不过,对于不同框架的实现方式,还可以多做些深入的探讨
有20位网友表示赞同!
坠入深海i
面试经验分享真的很重要!我以前确实对 IoC 和 AOP 不太了解,每次面试都被问懵了。感谢作者的分享,让我学到了很多知识!
有10位网友表示赞同!
看我发功喷飞你
还是那句话,理论知识和实践应用缺一不可!这篇博文讲得挺好的,希望能看到一些实际案例,以便更好地理解他们的使用场景
有11位网友表示赞同!
揉乱头发
个人觉得 IoC 和 AOP 都是非常强大的设计模式,能够提高代码的可测试性和可维护性。这篇文章很详细地解释了它们的概念和作用,让我更加明确该如何学习和应用。
有20位网友表示赞同!
逾期不候
文章写的不错,但我觉得对于一些比较复杂的原理,可以通过图形化的方式进行讲解,更容易让人理解。
有5位网友表示赞同!
青楼买醉
IoC 和 AOP 这两个概念确实很难一下子掌握,需要多实践才能理解!这篇文章总结的挺好,可以作为入门学习的参考材料!
有19位网友表示赞同!
微信名字
我最近也在学习这个知识点,看到这篇博文后感觉受益匪浅。特别是我之前就遇到过 IoC 和 AOP 会让人迷惑的情况,文章里解释得清明白白,让我终于能理解它们的区别了!
有15位网友表示赞同!