Spring依赖注入(DI)的三种方式


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">

<constructor­arg index="0" ref="login"></constructor­arg>

</bean>

我们使用constructor­arg来进行配置, 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方法或

者构造函数了。 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM