JavaEE企业级应用开发教程——第七章 Spring中的Bean管理(黑马程序员第二版)(SSM)

第七章 Spring中的Bean管理

在 Spring 中,Bean 是指注册到 Spring 容器中的 Java 类对象。Spring 容器负责管理这些 Bean 对象的生命周期,并提供了一系列的管理和操作 Bean 的 API。

Bean 在 Spring 中的作用非常重要,它们承载了应用程序的核心功能和业务逻辑。通过 Spring 容器的管理和操作,我们可以实现灵活、可扩展、可配置的应用程序设计。


7.1 Spring IoC容器

Spring框架的主要功能是通过Spring容器实现的,Spring容器可以帮助开发者管理应用程序中的各种对象(即Bean),包括创建、配置、初始化、依赖注入、生命周期管理等。Spring提供了相应的API来管理Bean,其中最常用的是BeanFactoryApplicationContext这两个接口。


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 是否延迟初始化,支持truefalse两种值,默认为false,即在容器初始化时就创建实例
init-method Bean的初始化方法,指定一个方法名,表示在Bean创建完成后调用的方法名,默认为空,即不调用初始化方法
destroy-method Bean的销毁方法,指定一个方法名,表示在Bean销毁时调用的方法名,默认为空,即不调用销毁方法。仅对singleton作用域的Bean有效

子元素名 描述
constructor-arg 用于依赖注入,指定构造函数的参数,可以使用valueref属性来指定参数值或引用其他Bean。也可以使用type属性来指定参数类型。value属性适用于基本类型和字符串等简单对象,ref属性适用于引用其他Bean对象
property 用于依赖注入,用于设置Bean属性值,可以使用valueref属性来指定属性值或引用其他Bean。也可以使用name属性来指定属性名。value属性适用于基本类型和字符串等简单对象,ref属性适用于引用其他Bean对象
qualifier 用于解决自动装配时的歧义性,指定Bean在容器中的唯一标识符
lookup-method 动态方法注入,用于解决单例Bean调用多例Bean方法的问题,指定一个方法名,表示需要在运行时动态获取一个新的Bean实例进行调用
replaced-method 方法替换,用于AOP,指定一个方法名,表示需要替换的原始方法名和替换方法名
alias 为Bean指定一个别名,可以通过该别名获取Bean实例,一个Bean可以有多个别名,也可以为多个Bean指定同一个别名
description 为Bean指定一个描述信息,提供说明文档或调试信息
value constructor-argproperty元素中的属性,用于指定基本类型或字符串等简单对象的值
ref constructor-argproperty元素中的属性,用于引用其他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");
    }
}

在这个示例中,我们定义了一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值