一、spring什么是依赖注入
首先你必须清楚ioc(控制反转)是一种编程思想,这种思想就是不要你来new对象,而是由容器来控制。既然是一种思想,那怎么来实现这种思想呢。那就是依赖注入,虽然还有其他的实现方式,但主要是依赖注入。所以一般我们讲ioc和依赖注入其实就是一码事。
好了你知道什么是依赖注入了,下面看看依赖注入的实现方法。
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?
二、在java中依赖注入有以下三种实现方式:
1.构造器注入
构造方法注入中,我们使用带参数的构造方法如下:
public class namebean { String name; public namebean(String a) { name = a; } }
我们会在创建bean实例的时候以new namebean(”tom”)的方式来设置name属性, Spring配置文件如下:
<bean id=”bean1″ > <constructor-arg> <value>My Bean Value</value> </constructor-arg> </bean>
使用constructor-arg标签来设置构造方法的参数。
2.Setter方法注入
一般情况下所有的java bean, 我们都会使用setter方法和getter方法去设置和获取属性的值,示例如下:
public class namebean { String name; public void setName(String a) { name = a; } public String getName() { return name; } }
我们会创建一个bean的实例然后设置属性的值,spring的配置文件如下:
<bean id=”bean1″ > <property name=”name” > <value>tom</value> </property> </bean>
Spring会调用setName方法来赋值name值为tom
3.接口注入
我们常常借助接口来将调用者与实现者分离。如:
public class ClassA {private InterfaceB clzB; public init() {Ojbect obj =Class.forName(Config.BImplementation).newInstance(); clzB = (InterfaceB)obj;} }
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB.
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。
这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。