Spring依赖注入(DI)的三种方式 Spring依赖注入(DI)的三种方式,分别为:
1. 接口注入
2. Setter方法注入
3. 构造方法注入
下面介绍一下这三种依赖注入在Spring中是怎么样实现的。
首先我们需要以下几个类:
接口 Login.java
接口实现类 LoginImpl.java
一个处理类 LoginAction.java
还有一个测试类 TestMain.java
LoginImpl.java如下:
1 package com.spring.test.di; 2 3 public class LoginImpl implements Login{ 4 5 public String getName(){ 6 7 return "fengyun"; 8 9 } 10 11 } 12 13 TestMain.java 14 15 package com.spring.test.di; 16 17 import org.springframework.context.ApplicationContext; 18 19 import org.springframework.context.support.FileSystemXmlApplicationContext; 20 21 public class TestMain { 22 23 /** 24 25 * @param args 26 27 */ 28 29 public static void main(String[] args) {// 得到ApplicationContext对象 30 31 ApplicationContext ctx = new FileSystemXmlApplicationContext( 32 33 "applicationContext.xml"); 34 35 // 得到Bean 36 37 LoginAction loginAction = (LoginAction) ctx.getBean("loginAction"); 38 39 loginAction.execute(); 40 41 } 42 43 }
LoginAction.java 会根据使用不同的注入方法而稍有不同
下面按照注入的方法来看LoginAction.java类
Setter方法注入:
1 package com.spring.test.di; 2 3 public class LoginAction { 4 5 private Login login; 6 7 public void execute() { 8 9 String name = login.getName(); 10 11 System.out.print("My Name Is " + name); 12 13 } 14 15 /** 16 17 * @return the login 18 19 */ 20 21 public Logic getLogin() { 22 23 return login; 24 25 } 26 27 /** 28 29 * @param login 30 31 * the login to set 32 33 */ 34 35 public void setLogin(Login login) { 36 37 this.login = login; 38 39 } 40 41 }
定义了一个Login 类型的变量 login, 在LoginAction并没有对login 进行实例化,而只有他对应的
setter/getter方法,因为我们这里使用的是Spring的依赖注入的方式
applicationContext.xml配置文件如下:
<bean id="login" class="com.spring.test.di.LoginImpl"/>
<bean id="loginAction" class="com.spring.test.di.LoginAction">
<property name="login" ref="login"></property>
</bean>
现在可以运行testMain.java了,我们可以看到控制台打出了 My Name Is fengyun
OK了,这就是spring的setter方法注入,非常简单
下面我们来看看构造方法注入
顾名思义,构造方法注入,就是我们依靠LoginAction的构造方法来达到DI的目的,如下所示:
1 LoginAction.java 2 3 package com.spring.test.di; 4 5 public class LoginAction { 6 7 private Login login; 8 9 public LoginAction(Login login) { 10 11 this.login = login; 12 13 } 14 15 public void execute() { 16 17 String name = login.getName(); 18 19 System.out.print("My Name Is " + name); 20 21 } 22 23 }
这里我们添加了一个LoginAction的构造方法
applicationContext.xml配置文件如下:
<bean id="login" class="com.spring.test.di.LoginImpl"/>
<bean id="loginAction" class="com.spring.test.di.LoginAction">
<constructorarg index="0" ref="login"></constructorarg>
</bean>
我们使用constructorarg来进行配置, index属性是用来表示构造方法中参数的顺序的,如果有多
个参数,则按照顺序,从 0,1...来配置
我们现在可以运行testMain.java了,结果跟使用Setter方法注入完全一样.其中需要注意一点有:构造函数有多个参数的话,如:参数1,参数2,而参数2依赖于参数1,这
中情况则要注意构造函数的顺序,必须将参数1放在参数2之前。
下面继续说说我们不常用到的接口注入,还是以LoginAction为例,我们对他进行了修改,如下所
示:
1 LoginAction.java 2 3 package com.spring.test.di; 4 5 public class LoginAction { 6 7 private Logic login; 8 9 public void execute() { 10 11 try { 12 13 Object obj = Class.forName("com.spring.test.di.LoginImpl") 14 15 .newInstance(); 16 17 login = (Login) obj; 18 19 String name = login.getName(); 20 21 System.out.print("My Name Is " + name); 22 23 } catch (Exception e) { 24 25 e.printStackTrace(); 26 27 } 28 29 } 30 31 }
配置文件:
<bean id="logic" class="com.spring.test.di.LoginImpl"/>
<bean id="loginAction" class="com.spring.test.di.LoginAction">
</bean>
我们最常用就是Setter和构造函数这两种注入方法
对于Spring的依赖注入,最重要的就是理解他的,一旦理解了,将会觉得非常的简单。无非就是让
容器来给我们实例化那些类,我们要做的就是给容器提供这个接口,这个接口就我们的set方法或
者构造函数了。