【Spring进阶系列丨第四篇】Spring的Bean管理(基于xml的配置)

前言

我们知道,容器是一个空间的概念,一般理解为可盛放物体的地方。在Spring容器通常理解为BeanFactory或者ApplicationContext。我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象。

那么Spring是如何管理Bean的呢?

在这里插入图片描述

文章目录

  • 前言
  • 一、概念
  • 二、创建Bean对象的三种方式
    • 2.1、使用默认构造函数创建方式
      • 2.1.1、定义Bean
      • 2.1.2、主配置文件中配置bean
      • 2.1.3、测试Bean
      • 2.1.4、注意点
    • 2.2、使用工厂中的实例方法创建方式
      • 2.2.1、定义工厂
      • 2.2.2、定义Bean
      • 2.2.3、主配置文件中配置Bean
      • 2.2.4、测试
    • 2.3、使用工厂中的静态方法创建方式
      • 2.3.1、定义工厂
      • 2.3.2、定义Bean
      • 2.3.3、主配置文件中配置Bean
      • 2.3.4、测试
  • 三、Bean对象的作用域
    • 3.1、说明
    • 3.2、作用域类型
    • 3.3、注意细节
    • 3.4、如何修改Bean的作用域
    • 3.5、测试
      • 3.5.1、测试singleton单例
      • 3.5.2、测试prototype多例
  • 四、Bean对象的生命周期
    • 4.1、单例对象
      • 4.1.1、说明
      • 4.1.2、测试
        • 4.1.2.1、定义Bean
        • 4.1.2.2、主配置文件中配置Bean
        • 4.1.2.3、测试
        • 4.1.2.4、测试结果
    • 4.2、多例对象
      • 4.2.1、说明
      • 4.2.2、测试
        • 4.2.2.1、定义Bean
        • 4.2.2.2、主配置文件中配置Bean
        • 4.2.2.3、测试1
        • 4.2.2.4、测试2
  • 五、总结

一、概念

简而言之,Spring bean是Spring框架在运行时管理的对象。Spring bean是任何Spring应用程序的基本构建块。你编写的大多数应用程序逻辑代码都将放在Spring bean中。

Spring bean的管理包括:

  • 创建一个对象
  • 提供依赖项(例如其他bean,配置属性)
  • 拦截对象方法调用以提供额外的框架功能
  • 销毁一个对象

Spring bean是框架的基本概念。作为Spring的用户,你应该对这个核心抽象有深刻的理解。


二、创建Bean对象的三种方式

2.1、使用默认构造函数创建方式

2.1.1、定义Bean

public class UserServiceImpl {
    
}

2.1.2、主配置文件中配置bean

<!-- 方式一:使用默认构造函数方式创建Bean   -->
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl"></bean>
</beans>

2.1.3、测试Bean

@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService);
}

2.1.4、注意点

此种方式采用的就是通过默认构造函数的方式创建Bean,假设我们给UserServiceImpl添加了一个带参的构造方法,则运行会报错,原因在于当我们为某个类自定义构造方法的时候,Java编译器便不会为该类提供默认的不带参数的构造方法了。

2.2、使用工厂中的实例方法创建方式

2.2.1、定义工厂

// UserService的工厂,作用是创建UserServiceBean对象
public class UserServiceImplFactory {

    public UserServiceImpl createUserService(){
        return new UserServiceImpl();
    }
}

2.2.2、定义Bean

public class UserServiceImpl {
    
}

2.2.3、主配置文件中配置Bean

<beans>
  	<!-- 方式二:使用工厂中提供的实例方法创建Bean   -->
  
	<!-- 第一步:把该工厂定义出来   -->
    <bean id="userServiceFactory" class="cn.bdqn.UserServiceImplFactory"/>
    <!-- 第二步:定义Bean(通过userServiceFactory中提供的实例方法)-->
    <bean id="userService" factory-bean="userServiceFactory" 
 						   factory-method="createUserService"/>
</beans>

2.2.4、测试

@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService);
}

2.3、使用工厂中的静态方法创建方式

2.3.1、定义工厂

// UserService的工厂,作用是创建UserServiceBean对象
public class UserServiceImplFactory {

    public static UserServiceImpl createUserService(){
        return new UserServiceImpl();
    }
}

2.3.2、定义Bean

public class UserServiceImpl {

}

2.3.3、主配置文件中配置Bean

<beans>
    <!-- 方式三:使用工厂中提供的静态方法创建Bean   -->

    <!-- 定义Bean(通过工厂类的静态方法创建)   -->
    <bean id="userService" class="cn.bdqn.UserServiceImplFactory" 
          				   factory-method="createUserService">
    </bean>
</beans>

2.3.4、测试

@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService);
}

三、Bean对象的作用域

3.1、说明

​ Spring对Bean的默认的作用域(作用范围)是singleton【单例】

3.2、作用域类型

  • singleton:单例的(默认值),只会new一次。

  • prototype:多例的,用到一次就会new一次。

  • request:作用于web应用的请求范围,Spring创建这个类之后,将这个类存到request范围内。

  • session:应用于web项目的会话范围,Spring创建这个类之后,将这个类存到session范围内。

  • global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session。

3.3、注意细节

实际开发中用得最多的就是singletonprototype在整合struts2的时候使用prototype,在整合SpringMVC的时候使用singleton。

3.4、如何修改Bean的作用域

bean标签的scope属性,作用:指定bean的作用范围。

3.5、测试

3.5.1、测试singleton单例

public class UserServiceImpl {
    
}
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl" />
</beans>
@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService");
        UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService1 == userService2); // true
}

3.5.2、测试prototype多例

public class UserServiceImpl {
    
}
<bean id="userService" class="cn.bdqn.UserServiceImpl" scope="prototype"/>
 @Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService");
        UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService1 == userService2); // false
}

四、Bean对象的生命周期

4.1、单例对象

4.1.1、说明

出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡

4.1.2、测试

4.1.2.1、定义Bean
public class UserServiceImpl {
    
    public UserServiceImpl(){
        System.out.println("对象的构造方法执行了");
    }

    public void init(){
        System.out.println("对象初始化了");
    }
    
    public void destroy(){
        System.out.println("对象销毁了");        
    }
}
4.1.2.2、主配置文件中配置Bean
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl"
          scope="singleton" init-method="init" destroy-method="destroy"/>
</beans>
4.1.2.3、测试
@Test
public void testUserService() throws Exception{
    // 1、读取主配置文件信息,获取核心容器对象
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

    ac.close();
}
// 结果:对于单例对象来说,只要容器创建了,那么对象就创建了。类似于立即加载。
4.1.2.4、测试结果

对象的构造方法执行了
对象初始化了
对象销毁了

总结:单例对象的生命周期和容器相同

4.2、多例对象

4.2.1、说明

出生:当我们使用对象时spring框架为我们创建
活着:对象只要是在使用过程中就一直活着。
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收

4.2.2、测试

4.2.2.1、定义Bean
public class UserServiceImpl {
    
    public UserServiceImpl(){
        System.out.println("对象的构造方法执行了");
    }

    public void init(){
        System.out.println("对象初始化了");
    }
    
    public void destroy(){
        System.out.println("对象销毁了");        
    }
}
4.2.2.2、主配置文件中配置Bean
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl"
          scope="prototype" init-method="init" destroy-method="destroy"/>
</beans>
4.2.2.3、测试1
@Test
public void testUserService() throws Exception{
   	// 1、读取主配置文件信息,获取核心容器对象
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

    ac.close();
}
// 结果:什么都不输出,说明容器启动的时候,对于多例对象来说并不会创建
4.2.2.4、测试2
@Test
public void testUserService() throws Exception{
   	// 1、读取主配置文件信息,获取核心容器对象
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

    UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");
    System.out.println(userService);
        
    ac.close();
}
/**
	结果:
		对象的构造方法执行了
		对象初始化了
	说明:
		对于多例对象来说,只有等到真正使用到该对象的时候才会创建。类似于懒加载。
**/

对于多例的Bean,Spring框架是不负责管理的


五、总结

在这里插入图片描述


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务号可以迁移到订阅号吗

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要看一下服务号和订阅号的主要区别。1、服务号推送的消息没有折叠&#xff0c;消息出现在聊天列表中&#xff0c;会像收到消息一样有提醒。而订阅号推送的消息是折叠的&#xff0c;“订阅号…

2023“亚太杯”大学生数学建模竞赛

2023亚太杯数学建模C题 中国新能源电动汽车的发展趋势 解题思路、数据 该题并没有提供数据集&#xff0c;对所需数据进行收集整理是对题目进行求解的基础。在本题中&#xff0c;主要需要以下数据&#xff1a;新能源汽车历史销售量、新能汽车相关专利的历史数量、充电桩历史数…

【外贸商机篇】黑色星期五来啦,跨境电商必备手册!

黑色星期五是每年11月的第四个星期五&#xff0c;三天后是网络星期一。这两个购物日是美国一年中最繁忙的购物日之一&#xff0c;仅在2021年的感恩节周末&#xff0c;电子商务收入估计就达到196亿美元。 在一项Statista调查中&#xff0c;美国消费者被问及他们计划购买哪些商品…

太赫兹涂层测厚:为汽车制造商保驾护航

太赫兹涂层测厚&#xff1a;为汽车制造商保驾护航 近年来&#xff0c;专用于测量任何表面涂层厚度的IRYS太赫兹系统&#xff0c;成功赢得了包括大众和丰田在内的全球领先整车厂的信任。 为了实现这一目标&#xff0c;IRYS系统经过了许多制造商为甄选值得信赖的技术供应商而设置…

软件开发及交付中,如何平衡项目进度和团队成员的利益?

在平衡软件质量与时间、成本、范围的关系时&#xff0c;需要考虑到项目管理的金三角概念&#xff0c;即时间、成本和范围。从项目管理的角度来看&#xff0c;项目进度和团队成员的利益需要平衡。 以下是一些建议&#xff1a; 制定可行的计划&#xff1a;让项目相关各方充分参与…

我劝烂了,这东西大学生早用早解脱

大学生看我&#xff0c;这个东西太太太香了啊&#xff01;&#xff01;&#xff01; 要写论文&#xff0c;写总结的都给我用起来 这东西能自动写文章&#xff0c;想写几篇就写几篇&#xff0c;篇篇不重复&#xff01;只要输入一个标题&#xff0c;马上就能生成一篇。真的贼香…

目前软件测试行业发展如何?第三方软件检测机构是否是未来趋势?

随着软件行业的快速发展&#xff0c;软件质量的重要性日益凸显&#xff0c;软件测试也成为了软件开发过程中不可或缺的环节。那么目前软件测试行业的发展如何?第三方软件检测机构又是否是未来软件测试的趋势呢?接下来我们将从多个角度为您详细解答。 目前软件测试行业呈现快…

老师检查家庭作业的作用

在教育体系中&#xff0c;老师检查家庭作业是一种常见的教学方式&#xff0c;旨在帮助学生巩固课堂所学知识&#xff0c;提高自学能力&#xff0c;以及培养良好的学习习惯。家庭作业是学生学习过程中不可或缺的一环&#xff0c;而老师对家庭作业的检查则起到了至关重要的作用。…

内容营销频频出圈,这些品牌号做对了什么?

小红书拥有大量的年轻用户&#xff0c;通过运营品牌号既能降低投放成本&#xff0c;又能更好地连接消费者和品牌&#xff0c;在平台完成一站式闭环营销。 今天就借助几个成功案例&#xff0c;来分析下他们是如何搭建官方账号&#xff0c;通过内容运营吸引更多用户&#xff0c;实…

航天博物馆3D虚拟交互展厅让大众对科技发展有更深切的理解和感受

博物馆作为人们了解历史、文化和艺术的重要场所&#xff0c;现在可以通过VR全景技术来进行展览&#xff0c;让参观者身临其境地感受历史文化的魅力。本文将介绍博物馆VR全景的特点、优势&#xff0c;以及如何使用VR全景技术来使得博物馆的展览和教育活动更丰富。 VR数字博物馆…

Python基础:生成器(Generators)和生成器表达式(Generator Expressions)详解

生成器&#xff08;Generators&#xff09;和 生成器表达式&#xff08;Generator Expressions&#xff09;是 Python 中用于处理迭代器和序列数据的强大工具。它们允许你按需生成值&#xff0c;而不是一次性生成所有值&#xff0c;从而节省内存和提高性能。 1. 生成器&#x…

【完整思路模型代码】2023年第十三届APMCM亚太地区大学生数学建模竞赛C题

2023年第十三届APMCM亚太地区大学生数学建模竞赛C题【完整数据、思路、模型、代码】 C题 中国新能源电动汽车的发展趋势 该题并没有提供数据集&#xff0c;对所需数据进行收集整理是对题目进行求解的基础。在本题中&#xff0c;主要需要以下数据&#xff1a;新能源汽车历史销…

Python入门指南之基本概率和语法基础

文章目录 一、基本概念二、控制流三、函数四、模块五、数据结构六、面向对象的编程七、输入输出八、异常九、Python标准库关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战…

漏洞复现--万户ezoffice FileCheckTemplateEdit SQL注入

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

玻色量子携最新相干光量子计算机惊艳亮相2023数字经济大会

7月4日至7日&#xff0c;2023全球数字经济大会在北京国家会议中心成功举办。该大会共有100企业参展&#xff0c;上市公司超40家&#xff0c;展区遴选展示了一批国内外数字经济产业的重要成果及重点打造的数字经济基础设施。作为北京市光量子计算领域的唯一一家代表企业&#xf…

竞赛选题 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

文章目录 1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的垃圾邮件分类 该项目…

全球三大网络安全威胁

网络安全IP数据云 - 免费IP地址查询 - 全球IP地址定位平台威胁日益复杂&#xff0c;涵盖了多个层面&#xff0c;从个人用户到大型企业&#xff0c;都面临着不同形式的网络安全威胁。以下是当前全球范围内广泛认可的三大网络安全威胁&#xff1a; 1. 恶意软件和病毒攻击&#x…

【实验笔记】C语言实验——降价提醒机器人

降价提醒机器人 题目&#xff1a; 小 T 想买一个玩具很久了&#xff0c;但价格有些高&#xff0c;他打算等便宜些再买。但天天盯着购物网站很麻烦&#xff0c;请你帮小 T 写一个降价提醒机器人&#xff0c;当玩具的当前价格比他设定的价格便宜时发出提醒。 输入格式&#xf…

给做steam游戏搬砖项目新手小白的5个警示

10分钟选完一个账号&#xff1f;自动选品软件一键下单功能讲解 今天&#xff0c;童话要向你们揭秘一个备受瞩目的项目——Steam搬砖项目。或许你们已经听闻过它的名字&#xff0c;但今天我要带领你们深入了解这个项目的本质&#xff0c;为你们揭示五个必须警惕的警示。让我们共…

第15届蓝桥杯Scratch选拔赛中级(STEMA)真题2023年10月

一、单选题 1.运行以下哪个程序后&#xff0c;巨嘴鸟会向下移动&#xff1f;&#xff08; &#xff09; A. B. C. D. 2.运行以下程序后&#xff0c; 能看到几只河豚鱼&#xff08; &#xff09;&#xff1f; A.3 B.4 C.6 D.7 3.以下运算结果为“False”的是&#xff08…