【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、打印beanSystem.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、打印beanSystem.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、打印beanSystem.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、打印beanSystem.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、打印beanSystem.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.hqwc.cn/news/213301.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(上)

目录 概述 云数据库开发 一、创建云数据库的对象类型。 二、预置数据&#xff08;为对象类型添加数据条目&#xff09;。 三、部署云数据库 云函数实现业务逻辑 一、创建云函数 二、云函数目录讲解 三、创建resources目录 四、获取云端凭据 五、导出之前创建的元数据…

数据分析基础之《matplotlib(2)—折线图》

一、折线图绘制与保存图片 1、matplotlib.pyplot模块 matplotlib.pyplot包含了一系列类似于matlab的画图函数。它的函数作用于当前图形&#xff08;figure&#xff09;的当前坐标系&#xff08;axes&#xff09; import matplotlib.pyplot as plt 2、折线图绘制与显示 展示城…

NVM得介绍和详细使用教程

NVM​​​​​​​&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具。它允许您在同一台计算机上轻松地切换和管理不同的Node.js版本。以下是NVM的介绍和详细使用教程&#xff1a; 安装NVM&#xff1a; 首先&#xff0c;您需要在计算机上安装N…

C++学习之路(一)什么是C++?如何循序渐进的学习C++?【纯干货】

C是一种高级编程语言&#xff0c;是对C语言的扩展和增强。它在C语言的基础上添加了面向对象编程&#xff08;OOP&#xff09;的特性&#xff0c;使得开发者能够更加灵活和高效地编写代码。 C的名字中的“”符号表示在C语言的基础上向前发展一步&#xff0c;即“加加”&#x…

Linux(Centos)上使用crontab实现定时任务(定时执行脚本)

场景 Windows中通过bat定时执行命令和mysqldump实现数据库备份&#xff1a; Windows中通过bat定时执行命令和mysqldump实现数据库备份_mysqldump bat-CSDN博客 上面讲windows中使用bat实现定时任务的方式&#xff0c;如果是在linux上可以通过crontab实现。 cron是服务名称。…

Python“牵手”京东商品详情接口运营场景,京东商品详情接口调用指南

京东商品详情接口是一种程序化的接口&#xff0c;通过这个接口&#xff0c;商家或开发者可以使用自己的编程技能&#xff0c;获取京东平台上的商品详细信息。这个接口允许商家根据自身的需求&#xff0c;获取商品的标题、价格、促销价、优惠券、库存、销量、详情图片、SKU属性、…

小叶子钢琴智能陪练 助力打牢钢琴基础

孩子在练琴过程中&#xff0c;经常会出现错音错节奏&#xff0c;为了能够帮助她更高效的练琴&#xff0c;最近开始使用智能钢琴陪练工具——小叶子钢琴智能陪练。 身边也有很多朋友在用这款应用&#xff0c;它比较知名的功能就是三大练琴模式&#xff0c;也就是识谱模式、提升…

揭秘周杰伦《最伟大的作品》MV,绝美UI配色方案竟然藏在这里

色彩在UI设计的基本框架中占据着举足轻重的位置。实际上&#xff0c;精心挑选和组合的色彩配色&#xff0c;往往就是UI设计成功的不二法门。在打造出一个实用的UI配色方案过程中&#xff0c;我们需要有坚实的色彩理论知识&#xff0c;同时还需要擅于从生活中观察和提取灵感。以…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 小程序商城免费搭建

使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用微服务如&#xff1a;商品、订单、购物车、个人中心、支…

2 使用React构造前端应用

文章目录 简单了解React和Node搭建开发环境React框架JavaScript客户端ChallengeComponent组件的主要结构渲染与应用程序集成 第一次运行前端调试将CORS配置添加到Spring Boot应用使用应用程序部署React应用程序小结 前端代码可从这里下载&#xff1a; 前端示例 后端使用这里介…

通过Whisper模型将YouTube播放列表中的视频转换成高质量文字稿的项目

项目简介 一个通过Whisper模型将YouTube播放列表中的视频转换成高质量文字稿的项目。 这个基于 Python 的工具旨在将 YouTube 视频和播放列表转录为文本。它集成了多种技术&#xff0c;例如用于转录的 Fast-Whisper、用于自然语言处理的 SpaCy 以及用于 GPU 加速的 CUDA&…

FreeSWITCH学习笔记:EventSocket

Event Socket命令最后需带有两个换行符。 api 执行API命令。阻塞。 1api API [ARG [ ...]] auth 内连模式下身份验证。需要第一个发送。 1auth PASSWORD bgapi 后台执行API命令。不阻塞。 1bgapi API [ARG [ ...]]2[Job-UUID: UUID] 返回带有Job-UUID。当API命令执行完成…