Spring依赖注入(DI)的三种方式,分别为:java
1. 接口注入spring
2. Setter方法注入app
3. 构造方法注入函数
下面介绍一下这三种依赖注入在Spring中是怎么样实现的。测试
首先咱们须要如下几个类:this
接口 Logic.javaxml
接口实现类 LogicImpl.java对象
一个处理类 LoginAction.java接口
还有一个测试类 TestMain.javaget
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方法或者构造函数了。