依赖注入和控制反转概念
依赖注入(IoC) 和 控制反转(DI) 有什么关系呢?其实它们是同一个概念的不同角度描述。
是指应用在运行期,由外部容器(Spring容器)动态地将依赖对象注入到另一个对象中。
理解 DI 的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”:
IoC 容器就是具有依赖注入功能的容器,IoC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中 new 相关的对象,应用程序由 IoC 容器进行组装。
注意: 建议采用设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他依赖关系的注入,则考虑采用设值注入。
<!-- 通过property属性注入(必须提供set方法) -->
<bean id="user" class="cn.sr.spring.javabean.User">
<property name="name" value="张三"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 通过构造函数注入 -->
<bean id="user" class="cn.sr.spring.javabean.User">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>
//除此之外还可以注入集合类型的对象,List、Set、Map、Properties……
对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成”依赖注入”——这就是所谓IoC的本质。
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下五种作用域:
<bean id="…" class="…" scope="singleton"></bean>
如果不指定Bean的作用域,Spring默认使用singleton作用域。prototype作用域的Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成果,就可以重复使用。因此,应该尽量避免将Bean设置成prototype作用域。
<bean id="user" class="cn.sr.spring.javabean.UserFactory" factory-mothod="getUser">
<constructor-arg name="name" value="张三"></constructor-arg>
</bean>
package cn.sr.spring.javabean;
public class UserFactory {
//对应factory-method
public static void getUser(String name) {
System.out.println("这是"+name);
}
}
<bean id="userFactory" class="cn.sr.spring.javabean.UserFactory" />
//此时getUser方法应为非静态
<bean id="user" factory-bean="userFactory" factory-mothod="getUser">
<constructor-arg name="name" value="张三"></constructor-arg>
</bean>
这里简单的说明一下,对于作用域为prototype的Bean,Spring在仅仅负责创建Bean,每当容器创建Bean后就交给客户端的代码进行维护。但是对应singlton作用域的Bean,Spring会进行创建一次,然后整个容器中共享。所以Spring容器会负责进行跟踪其状态,负责依赖的注入和依赖实例的分配。
本文只是做简单介绍,个人理解方面偏多,更多有关于IOC和DI以及Bean对象的详解介绍请自行查找相关资料!