spring依赖注入详解及实现方式

spring | 2019-09-13 10:02:39

一、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的表现形式。

登录后即可回复 登录 | 注册
    
关注编程学问公众号