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

Rac*_*hel 34 java aop spring dependency-injection inversion-of-control

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

有人能用简单的英文解释一下吗?

ewe*_*nli 47

我理解你的困惑,我花了一些时间来理解这些概念是如何相互关联的.所以这是我(以某种方式个人)对所有这些的解释:

1.控制倒置

控制反转是一种相当通用的设计原则,它指的是行为规范与实际执行时的解耦.比较一下,

myDependency.doThis();
Run Code Online (Sandbox Code Playgroud)

myDependency.onEventX += doThis();
Run Code Online (Sandbox Code Playgroud)

在后者中,没有更灵活的直接调用.在其一般形式中,控制的反转涉及观察者模式,事件回调.

2.依赖倒置

依赖倒置是另一种设计原则.粗略地说,它说更高级别的抽象不应该直接依赖于较低级别的抽象; 这种结果确实存在于一种设计中,如果没有较低级别的抽象,则无法重用更高级别的抽象.

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

 class App {
     void main() {  new HighLevelClass().doStuff(); }
 }
Run Code Online (Sandbox Code Playgroud)

在这里,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(); }
 }
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要任何特殊的容器来强制执行依赖项反转,这是一个原则.好的阅读是鲍勃叔叔的依赖倒置原则.

3.依赖注入

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

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

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

 class App {
     void main() {  DI.getHighLevelObject().doStuff(); }
 }
Run Code Online (Sandbox Code Playgroud)

请注意,有各种形式的注射.还要注意,在这种观点下,setter注入可以看作是一种回调形式 - DI容器创建对象然后回调setter.控制流有效地反转.

4. AOP

严格来说,AOP与之前的3点没什么关系.关于AOP开创性论文非常通用,并提出了将各种来源编织在一起(可能用不同语言表达)以生成工作软件的想法.

我不会在AOP上进一步扩展.这里重要的是,依赖注入和AOP可以很好地协同工作,因为它使编织变得非常容易.如果使用IoC容器和依赖注入来抽象出对象的实例化,则可以在注入依赖项之前轻松地使用IoC容器编织方面.否则,这将需要特殊编译或特殊编辑ClassLoader.

希望这可以帮助.


Tho*_*sen 10

如何解释依赖注入5岁时,依赖注入得到了很好的 解释?:

当你自己从冰箱里取出东西时,你可能会引发问题.你可能会把门打开,你可能得到妈咪或爸爸不希望你拥有的东西.您甚至可能正在寻找我们甚至没有或已经过期的东西.

你应该做的是说明需要,"我需要在午餐时喝点东西",然后当你坐下来吃饭时我们会确保你有东西.

AOP - 面向方面编程 - 基本上是指根据位于ELSEWHERE的规则,使用其他代码修改您编写的源.这意味着您可以在中央位置说"作为每个方法的第一行我想要'log.debug("输入方法() ")',然后使用该规则编译的每个方法都将具有包含该行."方面"是以其他方式查看代码的名称,而不仅仅是从第一个源行到最后一个.

控制反转基本上意味着你没有控制一切的中心代码(比如main()中的一个巨大的开关)但是有很多代码片段"以某种方式"被调用.该主题在维基百科上讨论:http: //en.wikipedia.org/wiki/Inversion_of_control

  • 投票否决的原因可能是您的答案没有解决这些概念之间的“关系”,这是问题中提出的,也是最困难的部分。(虽然我不是拒绝投票的人。) (2认同)