什么是依赖注入,以及为什么要使用依赖注入?
简单的解释,我们知道,如果我们有两个java类A和B的话,如果我需要在A中使用B的方法,那么最寻常的做法是在A类中new一个B类的对象,然后调用这个对象的各种方法。如果只有几个类还好,直接写在代码中就是了,但是如果有几十个几百个类呢?各个类之间相互调用。或许你觉得这也没什么,但是可怕的地方在于,如果需求变动,需要修改它们之间 的调用关系了,这时候该怎么办?没有一个人愿意在几百个类里一个一个找,然后一个一个改代码,这时候,或许你就想到要使用依赖注入技术了。
从名字上理解,所谓依赖注入(Dependency Injection),即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。DI还有一个名字,叫做控制反转(IOC),所谓控制反转,说的就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。
还是拿上面A和B的例子来说。使用了Spring后,A和B都在Spring的接管之下了,现在A要使用B的方法,但是A并不自己去直接调用B,而是告诉Spring,我需要一个B,你给我吧,然后Spring在自己的配置文件中找到B所对应的java类,返回一个相应的对象给A。如果以后A需要用到别的了,直接向Spring要一个C、D之类的,至于B,C,D是怎么创建的,A并不关心,A只要知道拿来就能用就可以了。
这个用专业的说法来说,叫做降低了代码之间的耦合,不同功能的组件并不在自身之内调用其他的组件,不同的组件是依靠Spring以一种松散的方式结合在一起的,极大的提高了代码的灵活性和复用性。
在Spring中的具体实现:
在Spring中,每一个组件(或者说类),都被Spring接管,Spring把它们叫做bean,Spring实例化Bean有三种方式,以下是三种方式的简要介绍。
1.使用类构造器实例化 [默认的类构造器]
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
2.使用静态工厂方法实例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){ // 注意这里的这个方法是 static 的!
return new OrderServiceBean();
}
}
3.使用实例工厂方法实例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
往Bean中注入其他的Bean有以下几种方法:
基本类型对象注入:
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<constructor-arg index=“0” type=“java.lang.String” value=“xxx”/>//构造器注入
<property name=“name” value=“zhao/>//属性setter方法注入
</bean>
注入其他bean:
方式一
<bean id="orderDao" class="cn.itcast.service.OrderDaoBean"/>
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<property name="orderDao" ref="orderDao"/>
</bean>
方式二(使用内部bean,但该bean不能被其他bean使用)
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<property name="orderDao">
<bean class="cn.itcast.service.OrderDaoBean"/>
</property>
</bean>
这些是Spring中Bean的简单配置,更多的详细配置,可以参考这篇文章。