【Spring】— Spring中Bean的配置、作用域

一、Bean的配置

    Spring用于生产和管理Spring容器中的Bean,需要开发者对Spring的配置文件进行配置。在实际开发中,最常采用XML格式的配置方式,即通过XML文件来注册并管理Bean之间的依赖关系。
    在Spring中,XML配置文件的根元素是beans,beans中可以包含多个bean子元素,每一个bean子元素定义了一个Bean,并描述了该Bean如何被装配到Spring容器中。子元素中包含多个属性和子元素,常用的属性和子元素如表所示。

在这里插入图片描述
    在Spring的配置文件中,通常一个普通的Bean只需要定义id(或name)和class两个属性即可。定义Bean的方式如下:

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <!--将指定类配置给 Spring ,Spring 创建其对象的实例-->
    <!--使用id属性定义bean1,其对应的实现类为com.ssm.ioc_di.Bean.Bean1-->
    <bean id="bean1" class="com.ssm.ioc_di.Bean.Bean1" />
    <!--使用name属性定义bean2,其对应的实现类为com.ssm.ioc_di.Bean.Bean2-->
    <bean name="bean2" class="com.ssm.ioc_di.Bean.Bean2" />

</beans>

    在上述代码中,分别使用id属性和name属性定义了两个Bean,并使用class元素指定其对应的实现类。
    注意:如果在Bean中未指定id和name,那么Spring会将class值当作id使用。

二、Bean的作用域

    通过Spring容器创建一个Bean的实例时,不仅可以完成Bean的实例化,还可以为Bean指定特定的作用域。

1.作用域的种类

    Spring 4.3中为Bean的实例定义了7种作用域,如表所示。其中,singleton和prototype是常用的两种。

在这里插入图片描述

2.singleton作用域

    singleton是Spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean的id属性相匹配,就会返回同一个Bean的实例。singleton作用域对于无会话状态的Bean(如Dao组件、Service组件)来说是最理想的选择。

    在Spring配置文件中,Bean的作用域是通过bean元素的scope属性来指定的,该属性值可以设置为singleton、prototype、request、session、globalSession、application、websocket七个值,分别表示上表中的7种作用域。要将作用域定义成singleton,需将scope的属性值设置为singleton,其示例代码如下。

<bean id="scope" class="com.ssm.ioc_di.Scope.Scope" scope="singleton"/>

    【示例2-1】下面通过一个案例来进一步演示singleton作用域。

    (1)在idea中创建一个名为chapter02的Web项目。

    (2)在chapter02项目的src目录下创建一个com.ssm.scope包,在该包中创建Scope类,该类不需要写什么方法。

package com.ssm.scope;
public class Scope {
    
    
}

    (3)在com.ssm.scope包中创建Spring的配置文件applicationContext.xml,并在配置文件中创建一个id为scope的Bean,通过class属性指定其对应的实现类为Scope。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <!-- 将指定类配置给Spring,让spring创建对象的实例-->
    <bean id="scope" class="com.ssm.scope.Scope" />

</beans>

    (4)在com.ssm.scope包中创建测试类ScopeTest来测试singleton作用域。

ScopeTest.java

package com.ssm.scope;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ScopeTest {
    
    

    public static void main(String[] args) {
    
    
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.输出获得的实例
        System.out.println(applicationContext.getBean("scope"));
        System.out.println(applicationContext.getBean("scope"));
    }
}

    执行程序后,控制台的输出结果如图所示。从中可以看出,两次输出的结果相同,这说明Spring容器只创建了一个Scope类的实例。

在这里插入图片描述
    注意:如果不设置scope=“singleton”,其输出结果也是一个实例,因为Spring容器默认的作用域就是singleton。

3.prototype作用域

    对需要保持会话状态的Bean应用使用prototype作用域。在使用prototype作用域时,Spring容器会为每个对该Bean的请求都创建一个新的实例。要将Bean定义为prototype作用域,只需在配置文件中将元素的scope属性值设置为prototype即可,其示例代码如下。

<bean id="scope" class="com.ssm.ioc_di.Scope.Scope" scope="prototype"/>

    配置文件更改成上述代码后,再次运行测试类ScopeTest,控制台的输出结果如图所示。从中可以看到,两次输出的Bean实例并不相同,这说明在prototype作用域下创建了两个不同的Scope实例。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45627039/article/details/130117984