【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.mzph.cn/news/165161.shtml

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

相关文章

【Docker】从零开始:9.Docker命令:Push推送仓库(Docker Hub,阿里云)

【Docker】从零开始&#xff1a;9.Docker命令:Push推送仓库 知识点1.Docker Push有什么作用&#xff1f;2.Docker仓库有哪几种2.1 公有仓库2.2 第三方仓库2.3 私有仓库2.4 搭建私有仓库的方法有哪几种 3.Docker公有仓库与私有仓库的优缺点对比 Docker Push 命令标准语法操作参数…

openEuler 22.03 LTS x86_64 cephadm 部署ceph18.2.0 未完成 笔记

环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

酷开系统 | 酷开科技聚焦价值人群 助力营销增长

2023年&#xff0c;是消费复苏回暖的一年&#xff0c;市场中充溢着大量品牌重启增长的机遇与实例。品牌商期望能够把握住市场趋势&#xff0c;通过营销获得确定性的业绩提升&#xff0c;并在未来收获长期稳定的增长。作为数字媒介的代表之一&#xff0c;OTT大屏营销的属性和价值…

Vue学习之路------指令

Vue指令 vue会根据不同的指令&#xff0c;针对标签实现不同的功能 指令:带有v-前缀的特殊标签属性 1&#xff1a;v-html&#xff1a;指令 <div v-html"msg"></div> 2&#xff1a;v-show 作用&#xff1a;控制元素显示隐藏 语法&#xff1a;v-show&quo…

【SpringMVC】 对请求的不同响应

前言 本文学习如何运用不同的注解来返回不同的响应. 1.返回静态页面Controller 返回index.html页面 Controller 和 RestController的区别 controller 只有加上这个注解,Spring才会帮我们管理这个代码.后续我们访问时才能访问到. RestController 等同于 Controller ResponseBo…

UML建模图文详解教程01——Enterprise Architect的安装与使用

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Enterprise Architect概述 官方网站&#xff1a;https://www.sparxsystems.cn/products/ea/&#xff1b;图示如下&#xff1a; Enterprise Architect是一个全功能的、基于…

B033-Servlet交互 JSP

目录 ServletServlet的三大职责跳转&#xff1a;请求转发和重定向请求转发重定向汇总请求转发与重定向的区别用请求转发和重定向完善登录 JSP第一个JSP概述注释设置创建JSP文件默认字符编码集 JSP的java代码书写JSP的原理三大指令九大内置对象改造动态web工程进行示例内置对象名…

2.HTML入门

目录 一.HTML介绍 二.HTML常用标签 2.1 标题标签 2.2 段落标签 2.3 超链接标签 2.4 图片标签 2.5 换行与空格 2.6 布局标签 2.7 列表标签 2.8 表单标签 一.HTML介绍 定义&#xff1a;将内容显示在网页&#xff0c;用来描述网页的一种语言&#xff0c;负责网页的架构…

Adiponectin 脂联素 ; T-cadherin +exosome

T-cadherin Adiponectin exosome T-cadherin Adiponectin exosome 代谢综合征中 外泌体、脂肪组织 和 脂联素 的器官间通讯-2019.pdf

C语言之字符串函数

C语言之字符串函数 文章目录 C语言之字符串函数1. strlen的使用和模拟实现1.1 strlen的使用1.2 strlen的模拟实现 2. strcpy的使用和模拟实现2.1 strcpy的使用2.2 strncpy的使用2.3 strcpy的模拟实现 3. strcat的使用和模拟实现3.1 strcat的使用3.2 strncat3.3 strcat的模拟实现…

什么是持续集成的自动化测试?

持续集成的自动化测试 如今互联网软件的开发、测试和发布&#xff0c;已经形成了一套非常标准的流程&#xff0c;最重要的组成部分就是持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff0c;目前主要的持续集成系统是Jenkins&#xff09;。 那么什么是持…

docker 安装常用环境

一、 安装linux&#xff08;完整&#xff09; 目前为止docker hub 还是被封着&#xff0c;用阿里云、腾讯云镜像找一找版本直接查就行 默认使用latest最新版 #:latest 可以不写 docker pull centos:latest # 拉取后查看 images docker images #给镜像设置标签 # docker tag […

FIB表与快速转发表工作原理

在一张路由表中&#xff0c;当存在多个路由项可同时匹配目的IP地址时&#xff0c;路由查找进程会选择掩码最长的路由项用于转发&#xff0c;即最长匹配原则。因为掩码越长&#xff0c;所处的网段范围就越小&#xff0c;网段的范围越小&#xff0c;就越能快速的定位到PC机的具体…

【分布式】小白看Ring算法 - 03

相关系列 【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 概述 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;是由NVIDIA开发的一种用于多GPU间…

GoLand 2023.2.5(GO语言集成开发工具环境)

GoLand是一款专门为Go语言开发者打造的集成开发环境&#xff08;IDE&#xff09;。它能够提供一系列功能&#xff0c;如代码自动完成、语法高亮、代码格式化、代码重构、代码调试等等&#xff0c;使编写代码更加高效和舒适。 GoLand的特点包括&#xff1a; 1. 智能代码补全&a…

Ubuntu安装CUDA驱动

Ubuntu安装CUDA驱动 前言官网安装确认安装版本安装CUDA Toolkit 前言 CUDA驱动一般指CUDA Toolkit&#xff0c;可通过Nvidia官网下载安装。本文介绍安装方法。 官网 CUDA Toolkit 最新版&#xff1a;CUDA Toolkit Downloads | NVIDIA Developer CUDA Toolkit 最新版文档&…

NX二次开发UF_CAM_update_list_object_customization 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_update_list_object_customization Defined in: uf_cam.h int UF_CAM_update_list_object_customization(tag_t * object_tags ) overview 概述 This function provids the…

UDP客户端使用connect与UDP服务器使用send函数和recv函数收发数据

服务器代码编译运行 服务器udpconnectToServer.c的代码如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #inclu…

Okhttp 浅析

安全的连接 OkHttpClient: OkHttpClient: 1.线程调度 2.连接池,有则复用,没有就创建 3.interceptor 4.interceptor 5.监听工厂 6.是否失败重试 7.自动修正访问,如果没有权限或认证 8是否重定向 followRedirects 9.协议切换时候是否继续重定向 10.Cookie jar 容器 默认…

pycharm 创建的django目录和命令行创建的django再使用pycharm打开的目录对比截图 及相关

pytcharm创建django的项目 命令行创建的django 命令行创建项目时 不带路径时 (.venv) D:\gbCode>django-admin startproject gbCode 命令行创建项目时 带路径时 -- 所以如果有目录就指定路径好 (.venv) D:\gbCode>django-admin startproject gbCode d:\gbCode\