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

news/2024/7/24 13:38:59 标签: spring, java, idea, ssm, bean

一、Bean的配置

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

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

java"><?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,其示例代码如下。

java"><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类,该类不需要写什么方法。

java">package com.ssm.scope;
public class Scope {
}

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

java">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作用域。

java">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即可,其示例代码如下。

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

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

在这里插入图片描述


http://www.niftyadmin.cn/n/245453.html

相关文章

【PWN刷题__ret2text】——CTFHub之 简单的 ret2text

萌新第一阶段自然是了解做题的套路、流程&#xff0c;简单题要多做滴 目录 前言 一、checksec查看 二、IDA反汇编 三、exp编写 前言 经典的ret2text流程 一、checksec查看 64位程序&#xff0c;什么保护都没有&#xff0c;No canary found——可以栈溢出控制返回 二、IDA反汇…

学习实践-Alpaca-Lora (羊驼-Lora)(部署+运行+微调-训练自己的数据集)

Alpaca-Lora模型GitHub代码地址 1、Alpaca-Lora内容简单介绍 三月中旬&#xff0c;斯坦福发布的 Alpaca &#xff08;指令跟随语言模型&#xff09;火了。其被认为是 ChatGPT 轻量级的开源版本&#xff0c;其训练数据集来源于text-davinci-003&#xff0c;并由 Meta 的 LLaMA …

Nacos Docker Kubernetes ⽣态

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

2023零基础快速跟上人工智能第一梯队

写在前面&#xff1a;有关人工智能学什么&#xff0c;怎么学&#xff0c;什么路线等一系列问题。我决定整理一套可行的规划路线&#xff0c;希望帮助准备入门的朋友们少走些弯路。 下面我会推荐一个比较快速可行的学习模板&#xff0c;并附上我认为比较好的学习资料。 新手不建…

apkanalyzer-classpath.jar 中没有.class 文件

apkanalyzer-classpath.jar 中没有.class 文件&#xff0c;apkanalyzer-classpath.jar 包目录下&#xff0c;只有 MANIFEST.MF 文件&#xff0c;如下截图&#xff1a; 而 apkanalyzer.jar 下&#xff0c;有很多 class 文件&#xff0c;其中&#xff0c;BinaryXmlParser.class 就…

20230420-上海广策信息技术笔试记录

1.小括号的有效性判断 LC的简单题&#xff0c;不知道为什么一直有3道用例错&#xff0c;枯了。 bool isValid(string s) {stack<int> st;for(int i 0; i < s.size(); i){// prevent cases like ))if(st.empty()){st.push(s[i]);}else if(s[i] { || s[i] [ || s[i…

【Linux】system V 消息队列 | system V 信号量(简单赘述)

文章目录 1 . system V 消息队列(了解)接口查看消息队列 2.system V 信号量 (了解)1.进程互斥等概念的理解2.认识信号量3. 接口 这两部分主要是了解即可&#xff0c;为后面学习做铺垫 1 . system V 消息队列(了解) 为了让两个进程间通信 创建一个队列queue 进程A可以通过消息队…

AutoGTP - 如何搭建本地的AI人工智能助手

简介 与其看着别人拿着其他人的作品到处吹牛逼,不如切身体验下,内心有数但是不乱说话,稳的一批才能做好老狗,如何识别一篇文章是不是 AI 创作的,那么就在文章中通过情感描述词进行书写,这样就不会被认为是人工智能批量生产的文章了,如果人工智能可以通过一个人过往的笔…