当前位置: 首页 > 面试题库 >

什么是AOP,依赖注入和简单的控制反转

范翰池
2023-03-14
问题内容

我试图理解AOP,依赖注入和控制SPRING的反转相关概念,但是我很难理解。

谁能用简单的英语解释一下?


问题答案:

我了解您的困惑,花了一些时间来了解这些概念如何相互关联。所以这是我对这一切的解释(某种程度上是个人的):

1.控制反转

控制反转是一种设计原则,而不是通用的,它是指行为规范与实际执行时的行为脱钩。比较一下

myDependency.doThis();

myDependency.onEventX += doThis();

在后者中, 没有直接调用 会更灵活。一般而言,控制反转与 观察者模式事件回调有关

2.依赖倒置

依赖倒置是另一种设计原则。粗略地说,它说较高级别的抽象不应直接依赖于较低级别的抽象。这确实导致了这样的设计:如果没有低层抽象,就不能重用高层抽象。

 class MyHighLevelClass {
     MyLowLevelClass dep = new MyLowLeverClass();
 }

 class App {
     void main() {  new HighLevelClass().doStuff(); }
 }

在这里,MyHighLevelClass无法访问无法编译MyLowLevelClass。为了打破这种耦合,我们需要使用接口对低层类进行 抽象
,并删除直接实例化。

class MyLowLevelClass implements MyUsefulAbstraction { ... }

class MyHighLevelClass {

    MyUsefulAbstraction dep;

    MyHighLevelClass( MyUsefulAbstraction dep ) {
        this.dep = dep;
    }
}

class App {
     void main() {  new HighLevelClass( new LowLevelClass() ).doStuff(); }
 }

请注意,原则上不需要像容器之类的特殊功能来强制执行依赖关系反转。鲍勃叔叔的《依赖倒置原理》是一本好书。

3.依赖注入

现在是依赖注入。对我来说dependency injection = IoC + dependency inversion

  1. 依赖关系是从外部提供的,因此我们强制执行依赖关系反转原则
  2. 容器设置了依赖关系(不是我们),所以我们说的是控制反转

在上面我提供的示例中,如果使用容器实例化对象并自动 依赖项 注入 到构造函数中,则可以完成依赖项注入(我们常说DI容器):

 class App {
     void main() {  DI.getHighLevelObject().doStuff(); }
 }

请注意,有多种注射形式。还要注意,在这种情况下,setter注入可以看作是回调的一种形式-
DI容器创建对象,然后回调setter。控制流实际上是反向的。

4. AOP

严格来说,AOP与之前的3点无关。关于AOP的开创性论文非常笼统,提出了将各种来源(可能用不同的语言表示)编织在一起以产生有效软件的想法。

我不会在AOP上进行更多说明。这里重要的是,依赖项注入和AOP可以有效地很好地配合使用,因为它使编织非常容易。如果使用IoC容器和依赖项注入来抽象对象的实例化,则可以在注入依赖项之前轻松地使用IoC容器来编织方面。否则,这将需要特殊的编译或特殊的ClassLoader

希望这可以帮助。



 类似资料:
  • 借助Spring实现具有依赖关系的对象之间的解耦。 对象A运行需要对象B,由主动创建变为IOC容器注入,这便是控制反转。 获得依赖对象的过程被反转了,获取依赖对象的过程由自身创建变为由IOC容器注入,这便是依赖注入。

  • 问题内容: 人们经常提到“依赖注入”和“控制反转”,这是使用Spring框架开发Web框架的主要优点。 如果可能的话,有人可以用一个简单的例子来解释它吗? 问题答案: 由于依赖注入, Spring有助于创建松耦合的应用程序。 在Spring中,对象定义其关联(依赖关系),而不必担心它们将如何获得这些依赖关系。Spring的责任是提供创建对象所需的依赖关系。 例如:假设我们有一个对象,并且它对对象有

  • 2.1依赖注入和控制反转 Java应用程序-这是一个宽松的术语,它包括的范围从受限的嵌入式应用程序到n层的服务器端企业应用程序-通常组成程序的对象互相协作而构成正确的应用程序。因此,在一个应用程序中的对象彼此具有_依赖关系(dependencies)。_ 虽然Java平台提供了丰富的应用程序开发功能,但它缺乏将基本的模块组织成一个整体的方法,而将该任务留给了架构师和开发人员。虽然你可以使用如_工厂

  • 2.1 依赖注入和控制反转 Java应用程序——范围从受限的、嵌入式的应用到N层的、服务器端的企业应用——通常由协作形成该程序的对象构成,因此一个应用程序中的对象彼此依赖。 虽然Java平台提供了大量的程序开发功能,但是它缺少将基础构建块组成一个整体的工具,而将此任务留给了架构师和开发者。尽管可以利用设计模式(比如Factory、Abstract Factory、Builder、Decorator

  • 本文向大家介绍理解php依赖注入和控制反转,包括了理解php依赖注入和控制反转的使用技巧和注意事项,需要的朋友参考一下 要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题:  DI——Dependency Injection   依赖注入 IoC——Inversion of Control  控制反转 1、参与者都有谁?   答:一般有三方参与者,一个是某个对象;一个是IoC/DI的

  • 问题内容: 已经发布了几个问题,其中包括有关依赖项注入的特定问题,例如何时使用它以及支持它的框架。然而, 什么是依赖项注入?何时/为什么/不应该使用它? 问题答案: 依赖注入 将依赖传递给其他 对象 或 框架 (依赖注入器)。 依赖注入使测试更加容易。注入可以通过 构造函数 完成。 其构造函数如下: 问题 :如果涉及复杂的任务,例如磁盘访问或网络访问,则 很难 对其进行单元测试。程序员必须进行模拟