Spring | Spring中的Bean (上)

这篇具有很好参考价值的文章主要介绍了Spring | Spring中的Bean (上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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) 属性来完成。
    name Spring容器同样可以通过此 (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属性用于指定参数值
    ref property、constructor-arg等元素的属性子元素,可以用于指定Bean工厂中某个Bean实例
    value property、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 | Spring中的Bean (上),框架知识点-合集,spring,java,后端
    从图可以看出 ,两次输出结果相同,这说明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 后,测试类运行结果如下 :
    Spring | Spring中的Bean (上),框架知识点-合集,spring,java,后端

由运行结果可知,两次输出Bean实例并不相同,这说明在prototype作用域下,创建了两个不同的Scope实例文章来源地址https://www.toymoban.com/news/detail-796922.html

到了这里,关于Spring | Spring中的Bean (上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring AOP官方文档学习笔记(四)之Spring AOP的其他知识点

    1.选择哪种AOP (1) 使用Spring AOP比使用完整版的AspectJ更方便简单,因为不需要在开发和构建过程中引入AspectJ编译器以及织入器,如果我们只希望通知能够在Spring Bean上执行,那么选用Spring AOP就可以了,如果我们希望通知能够在不由Spring所管理的对象上执行,那么就需要使用AspectJ,如果

    2024年02月03日
    浏览(37)
  • Spring Boot 基础知识点1 (含面试题1)

    Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具,它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序,并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到了广泛应用。 本次主要是

    2024年01月25日
    浏览(40)
  • 知识点13--spring boot整合elasticsearch以及ES高亮

    本章知识点沿用知识点12的项目,介绍如何使用spring boot整合ES,没有ES的去我主页 各类型大数据集群搭建文档--大数据原生集群本地测试环境搭建三 中可以看到ES如何搭建 不管你有没有ES,最好是没有,因为一定要知道一点,一定要去官网查一下你当前用的spring boot data es的版

    2024年02月12日
    浏览(50)
  • Spring框架中的Bean

    在Spring框架中,Bean是指一个由Spring容器管理的对象。这个对象可以是任何一个Java类的实例,例如数据库连接、业务逻辑类、控制器等等。Bean实例的创建和管理是由Spring容器负责的,而不是由应用程序本身负责。 Bean的主要优势是可以将对象的创建和管理与业务逻辑分离。这

    2023年04月09日
    浏览(31)
  • sql注入学习-知识点大合集

    目录 (一)sql注入了解: 1.1什么是sql注入 1.2 sql注入的分类 (二)sql注入详解: 2.1.MySQL注入 2.2.1在MySQL注入中,会用到的知识  2.2.2mysql常用语句与常见 2.2.3msyql注入内容详解 2.2.Oracle注入 2.2.1Oracle注入基础 2.2.2联合查询注入 2.3.SQL Server注入 2.3.1SQL Server 关键目录试图 2.3.2 

    2024年02月07日
    浏览(35)
  • 高三高考免费试卷真题押题知识点合集

      发表于安徽 温馨提示:有需要的真题试卷可联系本人,百卷内上免费资源。 感觉有用的下方三连,谢谢 ​ 。 免费版卷有6-60卷每卷平均4-30页 高三免费 高三地理 高三英语 高三化学 高三物理 高三语文 高三历史 高三政治 高三数学 高三生物 付费版卷有150页-5000页 高三付费

    2024年02月08日
    浏览(60)
  • 【C++】学习C++时,经常忘记的知识点合集(1)

    不清楚的知识点合集:C++篇 参考答案:chatgpt。有 些答案不保证正确 目前使用最广泛的C++标准是C++17。C++17于2017年发布,引入了许多新的语言特性和库功能,包括结构化绑定、constexpr if、折叠表达式、变量模板、并行STL算法等等。同时,C++17还对一些现有特性进行了改进和扩

    2024年02月08日
    浏览(34)
  • Python期末复习知识点大合集(期末不挂科版)

    本期博客总结了老师给出的考试范围的相关知识点,知识点总结的并不是很完整,更多详细细致的知识点可以去看一下我的Python专栏: Python编程基础 Python每日一学 知识点总结仅供参考,总结不易,期待得到你们的点赞收藏转发三连,谢谢!祝大家期末考试顺利通过!!!

    2024年02月03日
    浏览(51)
  • 【Matlab数理统计知识点合集】新手入门第十三天

    掌握随机数的产生 了解概率密度函数等函数的使用 掌握统计图表的绘制方法 随机数是专门的随机试验的结果。在统计学的不同技术中需要使用随机数,比如在从统计总体中抽取有代表性的样本的时候,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡罗模

    2023年04月11日
    浏览(43)
  • Spring框架中的Singleton和Prototype Bean作用域

    Spring框架是依赖注入的事实上的框架,在开发可扩展、弹性和安全的云原生环境中具有良好的记录。 在使用Spring Beans时,初学者经常会对Spring beans和它们的作用域感到有些困惑。 以下是我对Singleton和Prototype Bean作用域的简单示例进行阐述的尝试。 Singleton Bean作用域 :正如其

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包