依赖注入 DI:由容器动态地将某种依赖关系注入到组件中。
假设一个类 MyAction
中需要一个数据访问类的实例 MyDAO
。
set 方法注入
public class MyAction {
private MyDAO dao;
// 提供一个 set 方法
public void setMyDAO(MyDAO dao) {
this.dao = dao;
}
}
配置文件:
<!-- 配置 MyDAO 的实例 dao -->
<bean name="dao" class="MyDAO">
<property name="host" value="..." />
...
</bean>
<!-- 配置 MyAction 的实例 action -->
<bean name="action" class="MyAction">
<!-- 注入 dao 这个 bean -->
<property name="dao" ref="dao" />
...
</bean>
构造方法注入
public class MyAction {
private MyDAO dao;
// 提供一个包含 dao 的构造方法
public MyAction(MyDAO dao) {
this.dao = dao;
}
}
配置文件:
<!-- 配置 MyDAO 的实例 dao -->
<bean name="dao" class="MyDAO">
<property name="host" value="..." />
...
</bean>
<!-- 配置 MyAction 的实例 action -->
<bean name="action" class="MyAction">
<!-- 注入 dao 这个 bean -->
<constructor-arg ref="dao" />
...
</bean>
自动装配
Spring 2.5 开始提供了基于注解的自动装配机制来简化依赖注入。
-
@Autowired
:基于 类型 的自动装配注入 -
@Resource
:基于 名称 的自动装配注入
例如:
public class MyAction {
@Resource(name="dao")
private MyDAO dao;
}
以上的 @Resource
代码替换了如下的操作:
// set 方法
public void setMyDAO(MyDAO dao) {
this.dao = dao;
}
<!-- 配置 MyAction 的实例 action -->
<bean name="action" class="MyAction">
<!-- 注入 dao 这个 bean -->
<property name="dao" ref="dao" />
...
</bean>