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

news2024/11/18 12:26:13

一、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实例。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS问题记录 - Xcode 14.3版本运行项目报错

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 看到Xcode有新版本&#xff0c;没忍住点了升级&#xff0c;然后问题来了。 开发环境 macOS 13.3Xcode: 14.3 问题描述 Xcode 14.2版本运行项目一切正常&#xff0c;升级到14.3版本后运行报错。 运行到模拟器的报…

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

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

“MySQL5.6”、“索引优化”,其实都是索引下推

如果你在面试中&#xff0c;听到“MySQL5.6”、“索引优化” 之类的词语&#xff0c;你就要立马get到&#xff0c;这个问的是“索引下推”。 什么是索引下推 索引下推(Index Condition Pushdown&#xff0c;简称ICP)&#xff0c;是MySQL5.6版本的新特性&#xff0c;它能减少回…

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

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

OpenAI对实现强人工智能AGI的规划:《Planing for AGI and beyond》

OpenAI对实现AGI的长期和短期的计划&#xff1a;《Planing for AGI and beyond》 返回论文和资料目录 原文地址 1.导读 OpenAI最近这些年发布了很多令人印象深刻的模型&#xff0c;毫无疑问&#xff0c;OpenAI已经走在了人工智能领域的最前沿。但是很多人只注意到这些模型&…

Nacos Docker Kubernetes ⽣态

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

概率密度函数的非参数估计方法

概率密度函数的非参数估计方法 1. Parzen窗方法2. kn近邻估计 \qquad 直接由样本来估计概率密度 p ( x ) p(\boldsymbol{x}) p(x) 的方法&#xff0c;称为非参数方法 (non-parametric method) \text{(non-parametric method)} (non-parametric method)。 \quad ● \quad 概率…

数学建模第三天:数学建模算法篇之线性规划及matlab的实现

目录 一、前言 二、线性规划简介 1、线性规划模型介绍与特征 2、线性规划模型的一般形式 三、单纯形法 1、标准化 2、单纯形法解题 四、matlab解决问题1、matlab线性规划函数 2、解题代码 一、前言 数学建模&#xff0c;本意就是用来解决生活中的问题&#xff0c;我们今…

二叉树的前中后序遍历写法归纳

如题&#xff0c;对应力扣题目如下&#xff1a; 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 1.递归 1.1 先序遍历 根 -> 左 -> 右 所以,这个递归函数先打印根节点的值,然后递归地遍历左子树,最后递归地遍历右子树。如果传入的根节点是空,则直接返回…

Linux学习记录—— 이십일 进程间通信(3)信号量和消息队列

文章目录 1、消息队列2、信号量1、了解概念2、信号量理解 3、接口4、理解IPC 1、消息队列 两个进程ab之间系统维护一个队列结构&#xff0c;a进程往队列里放信息&#xff0c;信息编号为1&#xff0c;b进程往队列里放信息&#xff0c;信息编号为2&#xff1b;之后开始读取数据的…

HADOOP伪分布式安装步骤

HADOOP安装步骤 一.创建Hadoop用户 二.更新apt和安装vim编辑器 更新apt: sudo apt-get install update安装VIM编辑器&#xff1a; apt install vim在弹出的提示中输入yes(y) 三、安装SSH和配置SSH无密码登录 apt install openssh-serverssh登录&#xff1a; ssh localh…

Vue2组件通信专题

组件通信专题 一、vue2中常用的6中组件通信方式 1. props 适用于的场景&#xff1a;父子组件通信 注意事项&#xff1a; 如果父组件给子组件传递数据&#xff08;函数&#xff09;&#xff1a;本质其实是子组件给父组件传递数据。 如果父组件给子组件传递数据&#xff08…

【致敬未来的攻城狮计划】— 连续打卡第七天:(电脑重装系统)学习RA产品家族选型手册

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

大数据hadoop课程实验总结

1一.安装hadoop 本门课程使用的是centos7.2 64位操作系统&#xff0c;原生hadoop2.7.7,java1.7版本。 安装centos7.2系统&#xff1a; 创建系统的同时创建一个名为hadoop的账户。这一步不难&#xff0c;此处就不再详说。 没有hadoop用户可以创建一个Hadoop用户&#xff1a; …

ChatBox安装--ChatGPT的桌面客户端

ChatBox 是什么 是开源的 ChatGPT API (OpenAI API) 桌面客户端&#xff0c;Prompt 的调试与管理工具&#xff0c;支持 Windows、Mac 和 Linux。 > github地址 下载链接 支持的平台&#xff1a; Windows : 请下载.msi安装包 Mac&#xff1a;请下载.dmg&#xff08;推荐…

【微服务笔记13】微服务组件之Config配置中心基础环境搭建

这篇文章&#xff0c;主要介绍微服务组件之Config配置中心基础环境搭建。 目录 一、Config配置中心 1.1、什么是配置中心 1.2、Config配置中心特点 二、搭建Config配置中心 2.1、配置Git仓库 2.2、创建ConfigServer服务端 &#xff08;1&#xff09;引入依赖 &#xff…

性能测试,监控磁盘读写iostat

性能测试&#xff0c;监控磁盘读写iostat iostat是I/O statistics&#xff08;输入/输出统计&#xff09;的缩写&#xff0c;iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况&#xff0c;同时也会汇报出 CPU使用情况。同vmstat一样&#xff0c;ios…

【iOS-#import <> ““, @class和C- #include<> ““, 】

前言 寒假分享会的遗漏问题总结 引入 在C/CPP语言里&#xff0c;引入某个头文件的操作 #include<iostream> #include<string>也有 #include "string"同样在OC里面 引入某个类会用到 #import关键字 #import "LoginViewController.h" #im…

web开发HTML生成PDF的三种解决方案(服务器端mpdf、html2canvas.js、浏览器打印、PDF虚拟打印机)

系列文章目录 python数据可视化开发(4)&#xff1a;爬取对应地址的pdf文档并分类保存到本地文件夹&#xff08;爬虫&#xff09;php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案web开发HTML生成PDF的三种解决方案&#xff08;服务器端mdf、h2pdf.js、浏览…

Nuxt.js - 超详细实现路由 “伪静态“,将浏览器网页路径 URL 链接后面加上 .html 后缀名称(可以自定义任何结尾后缀名称)详细示例教程

前言 正常的项目,路由都是 /index | /user/add 这种,但有一个办法可以让其后面带上 .html,比如:/index.html。 本文 在 Nuxt.js 项目中,描述了如何实现伪静态详细教程,让页面路由后面都跟上一段自定义后缀名,比如 .html / .asp, 你可以按照本文的教程,最终得到伪静态…