DI(依赖注入,Dependency Injection)== IoC(控制反转,Inversion of Control).
(2)工业社会:工厂模式,需要斧子的人(调用者)找到工厂,购买斧子,无需关心斧子的制造过程。(简单的工厂设计模式)。(定位工厂,无需关心具体的实现。)
(3)共产社会:无需定位工厂,‘坐等’社会提供即可。无需关心调用者的实现,无需理会工厂,等待spring依赖注入。
2.各组件职责不清,只要关心组件的方法,不关心创建过程。)
DI:是指程序运行过程中,如果需要另一个对象协作(调用方法,访问属性)时,无须再代码中创建被调用者,而是依赖于外部容器的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持POJO之间依赖关系的管理。
2.构造注入(IoC容器使用构造器来注入被依赖的实例)
<!-- 配置名为person的Bean,其实现类是org.crazyit.app.service.Person类 -->
<bean id="person" class="org.crazyit.app.service.Person">
<property name="axe" ref="axe"/>
</bean>
<!-- 配置名为axe的Bean,其实现类是org.crazyit.app.service.Axe类 -->
<bean id="axe" class="org.crazyit.app.service.Axe"/>
<!-- 配置名为win的Bean,其实现类是javax.swing.JFrame类 -->
<bean id="win" class="javax.swing.JFrame"/>
<!-- 配置名为date的Bean,其实现类是java.util.Date类 -->
<bean id="date" class="java.util.Date"/>
2.在构造实例的过程中,已经完成了依赖关系的初始化。
public class Chinese implements Person
{
private Axe axe;
// 构造注入所需的带参数的构造器
public Chinese(Axe axe)
{
this.axe = axe;
}
// 实现Person接口的useAxe()方法
public void useAxe()
{
// 表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
}
<!-- 下面只有一个constructor-arg子元素,
<constructor-arg ref="steelAxe" type="org.crazyit.app.service.Axe"/>
</bean>
<!-- 配置stoneAxe实例,其实现类是StoneAxe -->
<bean id="stoneAxe" class="org.crazyit.app.service.impl.StoneAxe"/>
<!-- 配置steelAxe实例,其实现类是SteelAxe -->
<bean id="steelAxe" class="org.crazyit.app.service.impl.SteelAxe"/>
两种注入方式适用范围不同。
(2)构造注入的优点:1.可以决定依赖关系的注入顺序,优先依赖的优先注入。2.更符合高内聚的原则。(只有组件的创建者才能改变组件的依赖关系。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。