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

时间:2023-02-09 07:44:16

Spring依赖注入(DI)的三种方式,分别为:

1.  接口注入

2.  Setter方法注入

3.  构造方法注入

下面介绍一下这三种依赖注入在Spring中是怎么样实现的。

首先我们需要以下几个类:

接口 Logic.java

接口实现类 LogicImpl.java

一个处理类 LoginAction.java

还有一个测试类 TestMain.java

Logic.java如下:

package com.spring.test.di;

public interface Logic {

public String getName();

}

LogicImpl.java如下:

package com.spring.test.di;

public class LogicImpl implements Logic{

public String getName(){

return "fengyun";

}

}

TestMain.java

package com.spring.test.di;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TestMain {

/**

* @param args

*/

public static void main(String[] args) {

// 得到ApplicationContext对象

ApplicationContext ctx = new FileSystemXmlApplicationContext(

"applicationContext.xml");

// 得到Bean

LoginAction loginAction = (LoginAction) ctx.getBean("loginAction");

loginAction.execute();

}

}

LoginAction.java 会根据使用不同的注入方法而稍有不同

下面按照注入的方法来看LoginAction.java类

Setter方法注入:

package com.spring.test.di;

public class LoginAction {

private Logic logic;

public void execute() {

String name = logic.getName();

System.out.print("My Name Is " + name);

}

/**

* @return the logic

*/

public Logic getLogic() {

return logic;

}

/**

* @param logic

*            the logic to set

*/

public void setLogic(Logic logic) {

this.logic = logic;

}

}

定义了一个Logic 类型的变量 logic, 在LoginAction并没有对logic 进行实例化,而只有他对应的setter/getter方法,因为我们这里使用的是Spring的依赖注入的方式

applicationContext.xml配置文件如下:

<bean id="logic" class="com.spring.test.di.LogicImpl"/>

<bean id="loginAction" class="com.spring.test.di.LoginAction">

<property name="logic" ref="logic"></property>

</bean>

现在可以运行testMain.java了,我们可以看到控制台打出了 My Name Is fengyun

OK了,这就是spring的setter方法注入,非常简单

下面我们来看看构造方法注入

顾名思义,构造方法注入,就是我们依靠LoginAction的构造方法来达到DI的目的,如下所示:

LoginAction.java

package com.spring.test.di;

public class LoginAction {

private Logic logic;

public LoginAction(Logic logic) {

this.logic = logic;

}

public void execute() {

String name = logic.getName();

System.out.print("My Name Is " + name);

}

}

这里我们添加了一个LoginAction的构造方法

applicationContext.xml配置文件如下:

<bean id="logic" class="com.spring.test.di.LogicImpl"/>

<bean id="loginAction" class="com.spring.test.di.LoginAction">

<constructor-arg index="0" ref="logic"></constructor-arg>

</bean>

我们使用constructor-arg来进行配置, index属性是用来表示构造方法中参数的顺序的,如果有多个参数,则按照顺序,从 0,1...来配置

我们现在可以运行testMain.java了,结果跟使用Setter方法注入完全一样.

其中需要注意一点有:构造函数有多个参数的话,如:参数1,参数2,而参数2依赖于参数1,这中情况则要注意构造函数的顺序,必须将参数1放在参数2之前。

下面继续说说我们不常用到的接口注入,还是以LogicAction为例,我们对他进行了修改,如下所示:

LogicAction.java

package com.spring.test.di;

public class LoginAction {

private Logic logic;

public void execute() {

try {

Object obj = Class.forName("com.spring.test.di.LogicImpl")

.newInstance();

logic = (Logic) obj;

String name = logic.getName();

System.out.print("My Name Is " + name);

} catch (Exception e) {

e.printStackTrace();

}

}

}

配置文件:

<bean id="logic" class="com.spring.test.di.LogicImpl"/>

<bean id="loginAction" class="com.spring.test.di.LoginAction">

</bean>

对于接口注入这种方式,以上也只是我个人理解,不知道是否有什么问题。呵呵

我们最常用就是Setter和构造函数这两种注入方法,至于他们各自的对比,我想在只要baidu一下就可以有清楚的答案了。

对于Spring的依赖注入,最重要的就是理解他的,一旦理解了,将会觉得非常的简单。无非就是让容器来给我们实例化那些类,我们要做的就是给容器提供这个接口,这个接口就我们的set方法或者构造函数了。

Spring的依赖注入(DI)三种方式的更多相关文章

  1. Spring注解依赖注入的三种方式的优缺点以及优先选择

    当我们在使用依赖注入的时候,通常有三种方式: 1.通过构造器来注入: 2.通过setter方法来注入: 3.通过filed变量来注入: 那么他们有什么区别吗?应该选择哪种方式更好? 三种方式的区别小结 ...

  2. ASP&period;NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  3. SSH深度历险记(八) 剖析SSH核心原则&plus;Spring依赖注入的三种方式

           于java发育.一类程序猿必须依靠类的其他方法,它是通常new依赖类的方法,然后调用类的实例,这样的发展问题new良好的班统一管理的例子.spring提出了依赖注入的思想,即依赖类不由程 ...

  4. SSH深度历险(八) 剖析SSH核心原理&plus;Spring依赖注入的三种方式

           在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...

  5. Spring IOC 依赖注入的两种方式XML和注解

    依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP.而IOC中实现Bean注入的实现方式之一就是DI(依赖注入). 一 DI的原理 ...

  6. Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  7. Spring依赖注入的三种方式

    看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...

  8. Spring基础05——Spring依赖注入的三种方式

    Spring支持3种依赖注入的方式:属性注入.构造器注入.工厂 1.属性注入 属性注入即通过setter方法注入Bean的属性或依赖的对象.使用<property>元素,使用name属性指 ...

  9. spring4之依赖注入的三种方式

    1.Setter注入 <bean id="helloWorld" class="com.jdw.spring.beans.HelloWorld"> ...

  10. 在ASP&period;NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller ...

随机推荐

  1. 响应式布局1--媒体查询和-webkit-min-device-pixel-ratio

    -webkit-min-device-pixel-ratio其实就是这个玩意 window.devicePixelRatio是设备上物理像素和设备独立像素(device-independent pix ...

  2. SQL Server 2008 R2 开启允许远程连接

      方法/步骤 1 登陆SQL Server 2008(windows身份认证),登陆后右击,选择“属性”.   2 左侧选择“安全性”,选中右侧的“SQL Server 和 Windows 身份验证 ...

  3. php输出错误屏蔽的函数

    /** * 设置默认值方法 * @param mult $data * @param string $key key值 * @param string $default 默认值 */ public s ...

  4. HDU-4593&lpar;水题&rpar;

    Robot Problem Description A robot is a mechanical or virtual artificial agent, usually an electro-me ...

  5. error MSB6006&colon; &OpenCurlyDoubleQuote;CL&period;exe”已退出

    解决方案之一: 删除 \Windows\System32 目录下 mspdb110.dll. 试试吧.

  6. Linux在山Windows共享文件夹

    $ sudo mount.cifs //windows-ip/shared  /media/ -o user=username password=password 该命令挂载Windows在下面sha ...

  7. ZOJ 3728 Collision

    ---恢复内容开始--- 今天无事水一水,结果就看到这个水题了! 题意思是 有俩个区域如图 求在俩个圆之间的运动时间 给出 初始的开始点和速度的矢量式;而且这个点 不再俩个圆之间的区域,且碰到内测园会 ...

  8. ISAPI筛选器及对ASP源文件的保护

    ISAPI筛选器及对ASP源文件的保护 2009-04-21 01:45:57 标签:ISAPI 筛选器 ASP 源文件 保护 摘要:本文介绍了利用ISAPI筛选器保护ASP源文件的方法,并给出一个实 ...

  9. Spring-Data-Jpa环境配置与实际应用

    上次我们讲述了<Spring-Data-Jpa概述与接口>,接下来我们再讲讲Spring-Data-Jpa环境配置与实际应用. Spring-Data 方法定义规范与使用配置 简单条件查询 ...

  10. LOJ&period;2718&period;&lbrack;NOI2018&rsqb;归程&lpar;Kruskal重构树 倍增&rpar;

    LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...