1. 何为依赖
不管是面向对象,还是面向过程,一个应用总会分成许多的模块,然后由这些模块协同工作完成任务。要协同工作就会产生依赖,如一个方法调用另一个方法、一个对象包含另一个对象,这些都是依赖关系。
比如:类A要包含对象b的话,就需要在A里B b = new B(),这里明显是类A依赖对象b(因为怎么看都不像是对象b依赖类A……)
2. 何为依赖注入
I have to say, the translation sucks! I'd rather use 'Dependency Injection' or 'DI' instead.
所谓DI,就是由容器动态的生成依赖关系,应用可以方便的获取依赖(通俗地说就是类A不用再亲自B b = new B()来获取b对象)。从外表上看,就好像是容器将生成的依赖关系注入到应用之中。
3. DI的3种实现方式
- Interface Injection: 类A里不是用对象b,而是接口IB的实现ib,ib由外部创建并传入类A,类A不负责创建工作,如:
public class A
{
private InterfaceB ib;
public Object doSomething(InterfaceB impB)
{
ib = impB;
return ib.doIt();
}
}
最典型的例子的是doGet()、doPost()方法:
public class HelloServlet extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException
{...}
}
这里要注意的是,HttpServletRequest、HttpServletResponse都是接口,不要再当成是对象了。
- Setter Injection: 容器使用默认构造器来B b = new B(),再使用类B的Setter来修改b,再将b注入类A。如Spring中bean.xml的段
<bean id="TheAction" class="org.sklse.spring.UpperAction">
<property name="message">
<value>HeLLo</value>
</property>
</bean>
就指定了调用UpperAction的setMessage("HeLLo")。
- Constructor Injection: 与Setter Injection相对,Construction Injection就是不使用Setter,而是使用带参构造器来创建对象b。且不允许应用调用类B的Setter(可以根本不提供Setter给应用)。与Setter Injection相比,Constructor Injection创建对象b比较方便(Setter Injection要逐个域来Set),且保持了对象b的一致性,但不如Setter Injection来得灵活。
4. 控制反转
I have to say it again, the translation sucks! I'd rather use 'IoC' instead.
控制反转,IoC,Inversion of Control,实为“控制的反转”,差一个字理解就差这么远。
IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
分享到:
相关推荐
AEC Q100-002E.pdf
AEC-Q100-002E:2013 Human Body Model (HBM) Electrostatic Discharg
完整英文电子版 AEC-Q100-002E:2013 Human Body Model (HBM) Electrostatic Discharge(ESD) Test(人体模型(HBM) 静电放电(ESD)测试)。对符合 AEC Q100 标准的集成电路器件进行的所有 HBM 测试均应符合 ANSI/E...
前端工程化开发方案app-proto.abb27cd0-d17c-11e6-a8a8-cf002e4b7ba8.pdf
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
==> \\u002E 美元符号的转义:$ ==> \\u0024 乘方符号的转义:^ ==> \\u005E 左大括号的转义:{ ==> \\u007B 左方括号的转义:[ ==> \\u005B 左圆括号的转义:( ==> \\u0028 竖线的转义:| ==> \\u007C 右方...
这是从一个朋友那里拷贝过来的,比网上哪些东拼一点西凑一点的文章描述的详细多了,AXI协议标准。
很全的指令集,包含新的跟RFID相关的指令,支持斑马带RFID功能的工业打印机的打印控制 英文版的 !!!
flex嵌入字体时,可以使用该工具将指定文本批量转换为Unicode ,输出格式满足于flex 在font-face中使用unicodeRange来指定字符范围,例如: @font-face { src:local("Arial");... U+002E-U+002E; /* 点 [.] */ }
车用芯片设计规范 AEC-Q100