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


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

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

1.接口注入

2.Setter方法注入

3.构造方法注入

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

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

接口Logic.java

接口实现类LogicImpl.java

一个处理类LoginAction.java

还有一个测试类TestMain.java

Logic.java如下:

packagecom.spring.test.di;

publicinterfaceLogic{

publicString getName();

}

LogicImpl.java如下:

packagecom.spring.test.di;

publicclassLogicImplimplementsLogic{

publicString 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方法注入:

packagecom.spring.test.di;

publicclassLoginAction {

privateLogiclogic;

publicvoidexecute() {

String name =logic.getName();

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

}

/**

*@returnthelogic

*/

publicLogic getLogic() {

returnlogic;

}

/**

*@paramlogic

*thelogictoset

*/

publicvoidsetLogic(Logic logic) {

this.logic= logic;

}

}

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

applicationContext.xml配置文件如下:

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

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

<propertyname="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配置文件如下:

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

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

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

</bean>

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

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

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

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

LogicAction.java

packagecom.spring.test.di;

publicclassLoginAction {

privateLogiclogic;

publicvoidexecute() {

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();

}

}

}

配置文件:

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

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

</bean>

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

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

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

以上就是我对Spring的DI的一个简单的理解,希望在今后的工作继续深入的学习。

优质内容筛选与推荐>>
1、全面剖析Windows 7 - 70个隐蔽功能和小技巧总结
2、JAVA面试题解惑系列(四)——final、finally和finalize的区别
3、因为痛,所以青春之摘写
4、A DropDownList Bug
5、团队项目-需求分析


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号