Spring 学习笔记之配置 Bean

一、在 Spring 的 IOC 容器中配置 Bean

可以通过 Spring 的 XML 配置文件来配置 Bean,例如:

1
2
<!-- 配置Bean -->
<bean id="helloWorld" class="cn.javacodes.spring.beans.HelloWorld"></bean>

其中:

  • id 属性定义了 Bean 的名字,也作为该 Bean 在 Spring 容器中的引用;
  • class 属性定义了该 Bean 的类型

注意:

  • id 属性在 IOC 容器中是唯一的
  • 若 id 没有指定,Spring 自动将类名作为 Bean 的名字
  • id 可以指定多个名字,名字之间可用逗号、分号、空格分隔

二、Spring 容器

在 Spring IOC 容器读取 Bean 配置并创建 Bean 实例之前,必须对它进行实例化。只有容器实例化之后,才可以从 IOC 容器中获取 Bean 实例并使用。 Spring 提供了两种类型的 IOC 容器实现,无论使用哪种方式,配置文件时完全相同:

  • BeanFactory:IOC 容器的基本(底层)实现。BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;
  • ApplicationContext:提供了更多的高级特性,是 BeanFactory 的子接口。ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory。

三、ApplicationContext

ApplicationContext 有两个主要的实现类:

  • ClassPathXmlApplicationContext:从类路径下加载配置文件
  • FileSystemXmlApplicationContext:从文件系统中加载配置文件

ConfigurableApplicationContext 是 ApplicationContext 的子接口,增加了 refresh ()、close () 等方法,让 ApplicationContext 具有了启动、刷新、关闭上下文的能力。

注意:

  • ApplicationContext 在初始化上下文时就会实例化所有的单例 Bean,及其 scope(作用域)属性为 singleton 的 Bean。
  • WebApplicationContext 是专门为 Web 应用而准备的,它允许从相对于 Web 根目录的路径中完成初始化工作。

四、依赖注入

Spring 支持 3 种依赖注入的方式,分别是:

  • 属性注入(Setter 注入)
  • 构造器注入
  • 工厂方法注入

1、属性注入

1
2
3
<bean id="helloWorld" class="cn.javacodes.spring.beans.HelloWorld">
<property name="name" value="Spring 4.0" />
</bean>
  • 属性注入即通过 setter 方法注入 Bean 的属性值或依赖的对象;
  • 属性注入使用元素,使用 name 指定 Bean 的属性名称,value 属性或子节点指定属性值,使用 ref 属性指定依赖的对象;
  • 属性注入是最常用的注入方式;

2、构造方法注入

通过构造方法注入 Bean 的属性值或依赖的对象,它保证了 Bean 在实例化后就可以使用。 构造器注入在元素里声明属性,中常用的属性有 value、 index、type 等,注意:没有 name 属性。 (1)按索引匹配入参

1
2
3
4
5
6
7
<!-- 构造器注入-通过索引 -->
<bean id="car0" class="cn.javacodes.spring.beans.Car">
<constructor-arg value="A6L" index="0"></constructor-arg>
<constructor-arg value="奥迪" index="1"></constructor-arg>
<constructor-arg value="15648" index="2"></constructor-arg>
<constructor-arg value="240" index="3"></constructor-arg>
</bean>

(2)按类型匹配入参

1
2
3
4
5
6
<!-- 构造器注入-通过类型 -->
<bean id="car1" class="cn.javacodes.spring.beans.Car">
<constructor-arg value="卡宴" type="java.lang.String"/>
<constructor-arg value="保时捷" type="java.lang.String"/>
<constructor-arg value="260" type="double"/>
</bean>

3、工厂方法注入

有时候静态工厂方法是实例化对象的唯一方法。Spring 支持通过元素的 factory-method 属性类装配工厂创建的 bean。 例如如下是一个 Stage 单例类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package cn.javacodes.spring.beans;
/**
* Created by eric on 16-8-31.
*/
public class Stage {
private Stage() {
}
private static class StageSingletonHolder {
static Stage instance = new Stage();
}
public static Stage getInstance() {
return StageSingletonHolder.instance;
}
}

我们注意到该类只有一个 private 的构造方法,而并未提供公开的构造方法,因此在 Spring 中不能直接通过之前所述的方式来获得该类的 bean 对象。为了解决这个问题,Spirng 的标签提供了一个 factory-method 属性,配置如下所示:

1
2
<!-- 静态工厂方法注入-->
<bean id="theStage" class="cn.javacodes.spring.beans.Stage" factory-method="getInstance" />