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
:
在上面提供的示例中,如果使用容器实例化对象并在构造函数中自动注入依赖项(我们经常说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
归档时间: |
|
查看次数: |
21931 次 |
最近记录: |