概念
所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利和对象的生命周期的管理过程交由spring框架来处理,从此在开发过程中不在需要关注对象的创建和生命周期的管理,而是在需要的时候由spring框架提供,这个由spring框架管理对象创建和生命周期的机制称之为控制反转。而在创建对象的过程中spring可以依据配置对象的属性进行设置,这个过程称之为依赖注入,也就是DI。
Spring依赖注入的三种方式
- 接口注入
- Setter方法注入
- 构造方法呼入
下面介绍一下这三种依赖注入在Spring中是怎么样实现的:
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>
构造方法注入
顾名思义,构造方法注入,就是我们依靠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>