第七章 Spring中的Bean管理
在 Spring 中,Bean 是指注册到 Spring 容器中的 Java 类对象。Spring 容器负责管理这些 Bean 对象的生命周期,并提供了一系列的管理和操作 Bean 的 API。
Bean 在 Spring 中的作用非常重要,它们承载了应用程序的核心功能和业务逻辑。通过 Spring 容器的管理和操作,我们可以实现灵活、可扩展、可配置的应用程序设计。
7.1 Spring IoC容器
Spring框架的主要功能是通过Spring容器实现的,Spring容器可以帮助开发者管理应用程序中的各种对象(即Bean),包括创建、配置、初始化、依赖注入、生命周期管理等。Spring提供了相应的API来管理Bean,其中最常用的是BeanFactory和ApplicationContext这两个接口。
7.1.1 BeanFactory接口
BeanFactory是Spring容器最基本的接口,它的实现机制采用的是Java经典的工厂模式。BeanFactory接口提供了创建和管理Bean的方法,包括以下常用方法:
| 方法 | 描述 |
|---|---|
getBean(String name) |
根据Bean的名称获取Bean的实例 |
getBean(Class<T> requiredType) |
根据Bean的类型获取Bean的实例 |
getBean(String name, Class<T> requiredType) |
根据Bean的名称和类型获取Bean的实例 |
containsBean(String name) |
判断容器中是否包含指定名称的Bean |
isSingleton(String name) |
判断指定名称的Bean是否为单例模式 |
getType(String name) |
获取指定名称的Bean的类型 |
getAliases(String name) |
获取指定名称的Bean的所有别名 |
在Spring开发中,可以通过调用BeanFactory接口的常用方法来完成对Bean的操作。Spring提供了多个BeanFactory接口的实现类,其中最常用的是XmlBeanFactory。XmlBeanFactory可以读取XML文件并根据XML文件中的配置信息生成BeanFactory接口的实例,从而实现Bean的管理。XmlBeanFactory类读取XML文件生成BeanFactory接口实例的具体语法格式如下:
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
其中,ClassPathResource用于读取classpath中的XML文件,XmlBeanFactory用于根据XML文件中的配置信息生成BeanFactory接口的实例。通过这种方式,开发人员可以快速地创建一个Spring容器,并通过容器管理应用程序中的Bean。
7.1.2 ApplicationContext接口
ApplicationContext接口建立在BeanFactory接口的基础之上,它丰富了BeanFactory接口的特性,例如添加了对国际化、资源访问、事件传播等方面的支持。ApplicationContext接口可以为单例的Bean实行预初始化,并根据property元素执行setter方法,单例的Bean可以直接使用,提升了程序获取Bean实例的性能。
为了方便开发,Spring提供了多个常用的ApplicationContext接口实现类,具体如下表所示:
| ApplicationContext 接口实现类 | 描述 |
|---|---|
ClassPathXmlApplicationContext |
从classpath中加载XML配置文件创建Spring容器 |
FileSystemXmlApplicationContext |
从文件系统中加载XML配置文件创建Spring容器 |
WebApplicationContext |
在Web应用中加载XML配置文件创建Spring容器,可通过ServletContext或WebApplicationContext获取容器实例 |
AnnotationConfigApplicationContext |
基于注解配置创建Spring容器 |
GenericApplicationContext |
可以自定义BeanFactory、Environment、ConversionService等对象的创建,常用于扩展Spring容器的功能 |
StaticApplicationContext |
可以在非Spring环境中使用Spring IoC容器,如单元测试等场景 |
| 注:以上表格只列出了常用的ApplicationContext接口实现类,还有其他实现类未在此列举。 |
7.2 Bean的配置
Spring容器支持使用XML和Properties两种格式的配置文件来定义和配置Bean。其中,XML格式的配置文件是最常用的一种,它采用标准的数据传输和存储格式,便于查看和操作数据。在Spring中,XML配置文件的根元素是bean,每个bean子元素可以定义一个Bean,并通过该元素的属性来配置Bean的行为和属性。我们可以使用bean元素将Bean注册到Spring容器中,这样可以方便地将其纳入Spring容器管理,从而提高应用程序的可维护性和灵活性。在实际开发中,我们通常会使用XML格式的配置文件来配置和管理Spring应用程序中的Bean。
| 属性名 | 描述 |
|---|---|
id |
Bean的唯一标识符,可以通过该属性获取Bean实例,若未指定,则使用“类名首字母小写”作为默认标识符 |
class |
Bean的全限定类名,必须指定 |
scope |
Bean的作用域,支持singleton(单例,默认)和prototype(原型)两种作用域 |
lazy-init |
是否延迟初始化,支持true和false两种值,默认为false,即在容器初始化时就创建实例 |
init-method |
Bean的初始化方法,指定一个方法名,表示在Bean创建完成后调用的方法名,默认为空,即不调用初始化方法 |
destroy-method |
Bean的销毁方法,指定一个方法名,表示在Bean销毁时调用的方法名,默认为空,即不调用销毁方法。仅对singleton作用域的Bean有效 |
| 子元素名 | 描述 |
|---|---|
constructor-arg |
用于依赖注入,指定构造函数的参数,可以使用value或ref属性来指定参数值或引用其他Bean。也可以使用type属性来指定参数类型。value属性适用于基本类型和字符串等简单对象,ref属性适用于引用其他Bean对象 |
property |
用于依赖注入,用于设置Bean属性值,可以使用value或ref属性来指定属性值或引用其他Bean。也可以使用name属性来指定属性名。value属性适用于基本类型和字符串等简单对象,ref属性适用于引用其他Bean对象 |
qualifier |
用于解决自动装配时的歧义性,指定Bean在容器中的唯一标识符 |
lookup-method |
动态方法注入,用于解决单例Bean调用多例Bean方法的问题,指定一个方法名,表示需要在运行时动态获取一个新的Bean实例进行调用 |
replaced-method |
方法替换,用于AOP,指定一个方法名,表示需要替换的原始方法名和替换方法名 |
alias |
为Bean指定一个别名,可以通过该别名获取Bean实例,一个Bean可以有多个别名,也可以为多个Bean指定同一个别名 |
description |
为Bean指定一个描述信息,提供说明文档或调试信息 |
value |
constructor-arg和property元素中的属性,用于指定基本类型或字符串等简单对象的值 |
ref |
constructor-arg和property元素中的属性,用于引用其他Bean对象,属性值为被引用Bean的id属性值 |
在XML配置文件中,一个普通的 Bean 通常只需定义id(或者name)和 class 两个属性。
以下是在 XML 配置文件中定义一个普通的 Bean 的完整代码,包括定义 id 属性和定义 name 属性两种方式:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring 配置文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 使用 id 属性定义一个名为 exampleBean 的 Bean,对应的 Java 类为 com.example.ExampleClass -->
<bean id="exampleBean" class="com.example.ExampleClass"/>
<!-- 使用 name 属性定义一个名为 exampleBean2 的 Bean,对应的 Java 类为 com.example.ExampleClass -->
<bean name="exampleBean2" class="com.example.ExampleClass"/>
</beans>
在这个示例中,我们同时使用 id 和 name 属性定义了两个不同的 Bean。
在 Spring 中,如果一个 Bean 没有显式地指定 id 属性或 name 属性,也没有使用其他方式指定其唯一标识符,那么Spring 会自动生成一个唯一标识符。这个唯一标识符的格式为:类的全限定名#序号,其中 类的全限定名 是该 Bean 对应的 Java类的完整限定名,序号 是 Spring 自动生成的数字标识符,从 0 开始递增。
7.3 Bean的实例化
在 Spring 中,要使用容器中的 Bean 对象,需要将它们实例化。Spring 提供了多种实例化方式,包括构造方法实例化、静态工厂实例化和实例工厂实例化。下面分别对这三种方式进行详细讲解。
7.3.1构造方法实例化
构造方法实例化是最常用的实例化方式之一。在 Spring 中,我们可以使用 bean 元素的 class 属性指定 Bean 对应的 Java 类,并在bean元素内部使用 constructor-arg 元素指定构造方法的参数。例如:
<bean id="exampleBean" class="com.example.ExampleClass">
<constructor-arg value="Hello"/>
<constructor-arg ref="anotherBean"/>
</bean>
在这个示例中,我们使用了 class 属性指定了 Bean 对应的 Java 类 com.example.ExampleClass,并使用了两个 constructor-arg 元素指定了构造方法的两个参数。第一个参数是一个字符串常量 “Hello”,第二个参数是一个引用类型的 Bean,它的唯一标识符为 “anotherBean”。
7.3.2静态工厂实例化
静态工厂实例化是另一种常用的实例化方式。在这种方式中,我们需要在 Bean 对应的 Java 类中定义一个静态方法,用于创建 Bean 的实例。然后在 Spring 中使用 bean 元素的 class 属性指定 Bean 对应的 Java 类,并使用 bean 元素的 factory-method 属性指定静态方法的名称。例如:
public class ExampleFactory {
public static ExampleClass createExample() {
return new ExampleClass("Hello");
}
}
在这个示例中,我们定义了一个静态方法 createExample(),用于创建一个 ExampleClass 类型的对象,并将一个字符串 “Hello” 作为构造方法的参数。然后在 Spring 中使用以下方式来配置 Bean:
<bean id="exampleBean" class="com.example.ExampleFactory" factory-method="createExample"/>
在这个示例中,我们使用了 class 属性指定了 Bean 对应的 Java 类 com.example.ExampleFactory,并使用了 bean 元素的 factory-method 属性指定了静态方法的名称 createExample()。
7.3.3实例工厂实例化
实例工厂实例化是另一种实例化方式,在这种方式中,我们需要先创建一个工厂对象,然后使用工厂对象的实例方法来创建 Bean 对象。在 Spring 中,我们可以使用 bean 元素的 class 属性指定工厂对象对应的 Java 类,并使用 bean元素的 factory-bean 属性指定工厂对象的唯一标识符,使用 bean 元素的 factory-method 属性指定实例方法的名称。例如:
public class ExampleFactory {
public ExampleClass createExample() {
return new ExampleClass("Hello");
}
}
在这个示例中,我们定义了一

(SSM)&spm=1001.2101.3001.5002&articleId=129960909&d=1&t=3&u=b8afac522aab413b8e40cf8cc6ff48a2)
908

被折叠的 条评论
为什么被折叠?



