Spring | Spring中的Bean--上

news2024/11/27 18:13:39

目录:

  • Spring中的Bean:
    • 1.Bean的配置
    • 2.Bean的实例化
      • 2.1 构造器实例化
    • 3.Bean的作用域
      • 3.1 作用域的种类
      • 3.2 singleton作用域
      • 3.3 prototype 作用域

Spring中的Bean:

1.Bean的配置

  • Spring可以被看作是个一个大型工厂, 这个工厂的作用就是生产和管理Sping容器中的Bean。如果想要在项目中使用这个工厂,就需要开发者对Spring的配置文件进行配置

  • Spring容器支持 XMLProperties 两种格式的配置文件,在实际开发中,最常使用的就是XML格式的配置方式。这种配置方式通过XML文件注册并管理Bean之间的依赖关系

  • 在Spring中,XML配置文件的根元素 <beans>标签, <beans>中包含了多个<bean>子元素,每一个<bean>子元素定义了一个Bean并描述了该Bean如何被装配到Spring容器中<bean>元素中同样包含了多个属性以及子元素,如下表所示

  • 属性或子元素名称描述
    id是一个Bean唯一标识符,Spring容器对Bean的配置、管理都通过该 (id) 属性来完成。
    nameSpring容器同样可以通过此 (name) 属性容器中的Bean进行配置管理,name属性中可以为Bean指定多个名称,每个名称之间用逗号分号隔开。
    class该属性指定了Bean具体实现类,它必须是一个完整的类名,使用类的全限定名
    (如果Bean中没指定idnamespring会将class值当做id来使用)
    scope用来设定Bean实例的作用域,其属性值有: singleton(单例)、prototype(原型)、requestsessionglobal Sessionapplicationwebsocket
    默认值singleton
    constructor-arg<bean>元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的index属性指定构造参数的序号(从0开始),type属性指定构造参数的类型,参数值可以通过ref属性 或value属性直接指定,也可以通过ref或value子元素指定。
    property<bean>元素的子元素用于调用Bean实例中的stter方法完成属性赋值从而完成依赖注入。该元素的name属性指定Bean实例中的相应属性名ref 属性value属性用于指定参数值
    refproperty、constructor-arg等元素的属性子元素,可以用于指定Bean工厂中某个Bean实例
    valueproperty、constructor-arg等元素的属性子元素,可以用于直接指定一个常量值
    list用于封装List数组类型的依赖注入
    set用于封装Set类型属性的依赖注入。
    map用于封装Map类型属性的依赖注入。
    entry<map>元素的子元素,用于设置一个键值对。其key属性指定字符串类型的键值,refvalue子元素指定其值,也可以通过value-ref或value属性指定其值。
  • 配置文件中,通常一个普通的Bean只需要定义id(或name)和class两个属性即可,例子如下

    <?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">
    
        <!-- 该Bean的id(唯一标识符)为: bean1 ,其对应的实现类为com.Test.Bean1  -->
        <bean id="bean1" class="com.Test.Bean1"/>
    
        <!-- 使用name属性定义bean2,其对应的实现类为com.Test.Bean2 -->
        <bean id="bean1" class="com.Test.Bean2"/>
    </beans>
    

​ 上述例子中,分别使用配置文件中的id属性和name属性定义了两个bean,并用class元素指定其对应的实现类。(如果Bean中没指定idnamespring会将class值当做id来使用)

2.Bean的实例化

  • 在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean

  • 实例化Bean三种方式,分别为构造器实例化 (最常用)、 静态工厂方式实例化实例工厂方式实例化,其中最常用的是构造器实例化

    ps : 下面只具体讲解常用的 构造器实例化

2.1 构造器实例化

  • 构造器实例化指Spring容器通过Bean对应类中默认的无参构造方法实例化Bean

  • 在com.instance.constructor包下创建Bean1.javabean1.xml
    Bean1.java

    public class Bean1 {
    }
    

    bean1.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">
    
        <!--  在该配置文件中将 Bean1类 作为 Bean加入到 Spring容器中 -->
        <!--  该Bean的唯一标识/id为: bean1  -->
        <bean id="bean1" class="com.instance.constructor.Bean1"/>
    </beans>
    

    InstanceTest1.java

    public class InstanceTest1 {
        public static void main(String[] args) {
            //创建管理Bean的ApplicationContext (其底层也是IOC容器在管理Bean)
            ApplicationContext applicationContext =
                    new ClassPathXmlApplicationContext("com/instance/constructor/bean1.xml");
            //获得容器职工存储的Bean
            Bean1 bean = (Bean1) applicationContext.getBean("bean1");
            System.out.println(bean);
        }
    }
    

3.Bean的作用域

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

3.1 作用域的种类

  • Spring4.3中为 Bean的实例定义了7种作用域,如下表所示。

    作用域名称说明
    singleton
    (单例)
    使用singleton定义的Bean在Spring容器中将 只有一个实例,也就是说,无论有多少个Bean引用它,始终将指向同一个对象(spring容器创建一个Bean实例,共享使用,使用的都是同一个Bean)。这也是Spring容器默认的作用域
    prototype
    (原型)
    每次通过Spring容器获取的prototype定义的Bean时,容器都将 创建一个新的Bean实例
    request在一次HTTP请求中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Request内有效。
    session在一次HTTP Session中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Session内有效。
    globalSession在一个全局的HTTP Session中,容器会返回该Bean的同一个实例。 仅在使用portle上下文时有效。
    application为每个SenletContext对象创建一个实例。仅在Web相关的AplcatinConext中生效。
    websocket为每个websocket对象创建一个实例。仅在Web相关的AplcationContext中生效。

3.2 singleton作用域

  • singletonSpring容器默认作用域 (创建一个Bean实例,然后共享/共同使用这个bean),当Bean的作用域为singleton时,Spring 都只会存在一个共享Bean实例(一个Bean被共享使用),并且所有对Bean的请求,只要id 与 该Beanid属性相匹配就会返回同一个Bean实例。

  • singleton 作用域对于无会话状态的Bean (如Dao组件、Service组件)来说,是最理想的选择。

  • Spring配置文件中,Bean的作用域是通过<bean>元素的scope属性来指定的,该属性可以设置为singleton、prototype、request、session、globalSession、application 和 websocket 七个值,分别表示表Bean七种作用域例子如下 :

    Scope.java

    package com.scope;
    public class Scope {
    }
    

    1 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">
    
        <!--  把Scope类作为Bean添加到容器中   -->
        <!--
        设置该Bean的作用域范围是 : singleton(不过默认的也是singleton)
        singleton : 该Bean在容器中只有一个实例,也就是无论需要多个Bean,使用/依赖注入的都是同一个Bean实例
        (输出的地址信息都是一致的)
        -->
        <bean id="scope" class="com.scope.Scope" scope="singleton"/>
    </beans>
    

    1 ScopeTest.java

    package com.scope;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class ScopeTest {
        public static void main(String[] args) {
            //1.配置文件路径
            String xmlPath = "com/scope/applicationContext.xml";
            //2.加载配置文件
            ApplicationContext applicationContext =
                    new ClassPathXmlApplicationContext(xmlPath);
            //输出实例
            System.out.println(applicationContext.getBean("scope")); //com.scope.Scope@737996a0
            System.out.println(applicationContext.getBean("scope")); //com.scope.Scope@737996a0
             /*
               此处从spring容器中获得了两个bean,但id是一致的,且设置的作用域范围是: singleton,
               所以这两个Bean都是同一个Bean的实例,两个Bean的地址信息都是一致的。
             */
        }
    }
    

    ScopeTest测试类运行结果如下:

    在这里插入图片描述
    从图可以看出 ,两次输出结果相同,这说明Spring容器只创建了一个Scope类的实例。需要注意的是,如果不设置 scope=“singleton”,其输出结果也是一个实例,因为Spring容器默认的作用域就是singleton

3.3 prototype 作用域

  • 对需要保持会话状态Bean (如Struts2的Action 类) 应该使用prototype作用域。在使用prototype作用域时,Spring 容器会为每个对该Bean的请求都创建一个新的实例 (每次都是实例化一个新的Bean)

  • 要将Bean定义为prototype 作用域,只需在配置文件中将<bean>元素的scope属性值设置为prototype 即可,其示例代码如下。

     <!--  该Bean的作用域范围是 :  prototype
       prototype : Spring容器会为每个对该Bean的请求都创建一个新的实例
    -->
    <bean id="scope" class="com.scope.Scope" scope="prototype"/>
    

    ApplicationContext中的Bean的作用域范围改为: prototype 后,测试类运行结果如下 :
    在这里插入图片描述

由运行结果可知,两次输出Bean实例并不相同,这说明在prototype作用域下,创建了两个不同的Scope实例

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

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

相关文章

QtCreator12无法识别Qt5.15.2的安卓SDK与NDK配置解决

解决方法: 设置JDK为JDK11 使用Android Studio下载 Android SDK Command-line Tools 10.0 打开Android SDK Location : 双击打开cmdline-tools 复制10.0中所有东西到latest中 点击Manage Kits并选择Devices 然后点击Android会弹出下图窗口,并自动更 安装完成 成功识别

Jupyter Notebook五分钟基础速通

1 作用 常用于数据分析 2 安装 2.1 Anaconda 通过直接安装Anaconda&#xff0c;会自动安装Jupyter Notebook 2.2 命令行安装 ① 3.x版本 pip3 install --upgrade pip pip3 install jupyter ② 2.x版本 pip install --upgrade pip pip install jupyter 3 启动 cmd窗口下…

Spring+SpringMVC+Mybatis进行项目的整合

Spring SpringMVCM Mybatis 整合 一、 通过idea创建maven工程 二、 引入依赖项以及导入mybatis逆向工程的插件 将如下的文件替换所在工程的pom文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4…

Java_二叉树详解

前言 程序员优劣之间最明显的就是数据结构和算法的掌握程度,二叉树作为数据结构中不可缺少的一员,可见其重要程度.我们一起来简单地学习二叉树吧~ 树型结构 在我们学习二叉树前先了解一下树型结构(二叉树是树型结构中的一种) 树是一种非线性的数据结构,它是有n (n>0) 个…

css-动画效果学习示例

阴影 x-轴 y-轴 模糊度 颜色 (正负值可以表示角度问题) 可以加多个阴影 内置阴影 transition 可以添加动画延迟效果 向z轴缩进&#xff0c;开启透视respective 触发旋转效果 学习来源 &#xff1a;动画属性_哔哩哔哩_bilibili

JavaScript 学习笔记(WEB APIs Day1)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

【Proteus仿真】【STM32单片机】甲醛浓度检测报警器

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用蜂鸣器LED模块、LCD1602显示模块、按键、MS1100甲醛传感器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示甲醛气体浓度检测…

物联网孢子捕捉分析仪在农田起到什么作用

TH-BZ03随着科技的飞速发展&#xff0c;物联网技术在农业领域的应用越来越广泛。其中&#xff0c;物联网孢子捕捉分析仪作为一种先进的设备&#xff0c;在农田中发挥着不可或缺的作用。本文将详细介绍物联网孢子捕捉分析仪在农田中的作用。 一、实时监测与预警 物联网孢子捕捉分…

【Docker】使用Docker安装Nginx及部署前后端分离项目应用

一、Nginx介绍 Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。它是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的&#xff0c;公开版本1.19.6发布于2020年12月15日。其将源代码以类BSD许可证的形式发布&#xff0c;因它…

项目经理进阶之路:如何应对不同阶段的挑战?

最近看到一个帖子&#xff0c;有网友提问&#xff0c;“项目经理的职业发展会经历哪几个阶段&#xff1f;不同阶段需要关注什么&#xff1f;又分别会遇到哪些挑战&#xff1f;“这个帖子引发了广大项目经理们的热议&#xff0c;大家纷纷吐槽&#xff0c;自己遇到了职业瓶颈、询…

Qt SDL2播放Wav音频

这里介绍两种方法来实现Qt播放Wav音频数据。 方法一&#xff1a;使用QAudioOutput pro文件中加入multimedia模块。 #include <QApplication> #include <QFile> #include <QAudioFormat> #include <QAudioOutput>int main(int argc, char *argv[]) {…

RK3566 linux修改CMA size

1、进入内核配置界面 执行命令&#xff1a; cd kernel make ARCHarm64 menuconfig 2、搜索CONFIG_CMA_SIZE_MBYTES 在配置界面输入/搜索CONFIG_CMA_SIZE_MBYTES&#xff0c;结果如下&#xff1a; 根据提示进入以下界面&#xff1a; 修改Size in Mega Bytes的值。

【时间复杂度】时间复杂度优化法则简讲

一、引言 时间复杂度是衡量算法运行效率的一项重要指标&#xff0c;它描述了随着输入规模的增加&#xff0c;算法的执行时间如何增长。在算法设计与分析中&#xff0c;我们经常面临着优化时间复杂度的任务&#xff0c;以便提高程序的性能。本博客将深入探讨时间复杂度的优化法…

UJA1169A恢复出厂设置(Restoring factory preset values)

UJA1169A是一款CAN芯片&#xff0c;同时又带有硬件看门狗的功能。出厂默认是Forced Normal模式&#xff0c;此时看门狗是禁用的。CAN通信的正常功能是在Forced Normal/Normal模式下才好用的&#xff0c;Normal模式下需要配置。包含位FNMC&#xff08;地址74h&#xff09;的寄存…

Uniapp多选Popup(弹出层)

uniapp中多选组件很少&#xff0c;故个人简单开发了一个&#xff0c;可简单使用&#xff0c;也可根据个人需求稍微改进 支持的功能 单选多选&#xff08;默认&#xff09;限制选择数量默认选中禁用选项 属性说明 属性默认值说明singlefalsetrue为开启单选&#xff0c;否则为…

【网络安全】2024年一个漏洞4w+,网安副业挖SRC漏洞,躺着把钱挣了!

一个漏洞奖励2w&#xff0c;这是真实的嘛&#xff01; 作为资深白帽&#xff0c;入行网安这些年也一直在接私活&#xff0c;副业赚的钱几乎是我工资的三倍&#xff01;看到最近副业挖漏洞的内容非常火爆&#xff0c;我便决定将自己的经验分享出来&#xff0c;带我的粉丝们一起…

css3 纯代码案例

css3 纯代码案例 前言渐变之美1.1 纯CSS3实现的渐变背景1.2 使用多重颜色和方向打造丰富渐变效果1.3 渐变色停留动画的巧妙运用 纯CSS图形绘制2.1 使用border属性制作三角形、梯形等形状伪类箭头图标2.2 利用transform创建旋转、缩放的图形 浮动的阴影敲代码css准备reset 样式复…

JS封装本地缓存的设置,读取,移除,清空方法及使用示例

我封装了一个JS通用的缓存管理对象&#xff0c;可以提供缓存的设置&#xff0c;读取&#xff0c;移除&#xff0c;清空操作&#xff0c;使用也很方便&#xff0c;封装方法的代码在最下方。 Q: 为什么不直接用原生的缓存方法&#xff0c;要封装&#xff1f; A1:原生的缓存管理…

MySQL篇—性能压测工具mysqlslap介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

SpringBoot参数校验@Validated、@Valid

SpringBoot参数校验Validated、Valid&#xff08;javax.validation&#xff09; 一、应用场景 在实际开发中&#xff0c;前端校验并不安全&#xff0c;任何人都可以通过接口来调用我们的服务&#xff0c;就算加了一层token的校验&#xff0c;有心人总会转空子&#xff0c;来传…