我尝试理解AOP、依赖注入和控制反转这些与SPRING相关的概念,但是我很难理解。是否有人可以用简单易懂的英语来解释一下?
myDependency.doThis();
使用
myDependency.onEventX += doThis();
class MyHighLevelClass {
MyLowLevelClass dep = new MyLowLeverClass();
}
class App {
void main() { new HighLevelClass().doStuff(); }
}
class MyLowLevelClass implements MyUsefulAbstraction { ... }
class MyHighLevelClass {
MyUsefulAbstraction dep;
MyHighLevelClass( MyUsefulAbstraction dep ) {
this.dep = dep;
}
}
class App {
void main() { new HighLevelClass( new LowLevelClass() ).doStuff(); }
}
依赖注入 = IoC + 依赖反转
: class App {
void main() { DI.getHighLevelObject().doStuff(); }
}
ClassLoader
。依赖注入在如何向5岁儿童解释依赖注入?中得到了很好的解释:
当你自己去冰箱里拿东西时,你可能会引起问题。你可能会把门打开,你可能会拿一些爸爸妈妈不想让你拿的东西。你甚至可能在寻找我们没有的东西或过期的东西。
你应该做的是表达一个需求,“我需要午饭时喝点东西”,然后我们会确保你吃饭时有东西喝。
AOP - 面向切面编程 - 基本上意味着您编写的源代码会根据其他位于ELSEWHERE的规则进行修改。这意味着您可以说“对于每个方法的第一行,我希望在一个中央位置有一个'log.debug(“entering method()”)',然后您使用该规则编译的每个方法都将包含该行。 "Aspect" 是从第一行源代码以外的方式查看代码的名称。
控制反转基本上意味着您没有一个中心化的代码控制一切(例如在main()中的巨型开关),而是有很多“某种方式”调用的代码块。该主题在维基百科上进行了讨论:http://en.wikipedia.org/wiki/Inversion_of_control
依赖注入和控制反转的区别在这篇文章中有很好的解释。
("你是指依赖反转,对吗?"部分)
总结:
DI关注的是一个对象如何获取依赖。当依赖从外部提供时,系统使用DI。
IoC关注的是谁发起调用。如果你的代码发起了调用,则不是IoC;如果容器/系统/库回调到你提供的代码,则是IoC。
来自《Spring实战》的简单比较:
依赖注入(DI)帮助你将应用程序对象解耦,AOP则帮助你将横切关注点从它们所影响的对象中解耦。