Java Spring Bean的实例化

news2024/9/20 8:37:03

Java Spring Bean的实例化

Spring框架支持两种方式去进行Bean的管理:BeanFactoryApplicationContext

BeanFactory:pom文件引入spring-context坐标,创建对应的待IOC类,然后在bean.xml注入,最后在调用处初始化BeanFactory及xml加载获取

ApplicationContext:内部封装了BeanFactory,在基础上进行了扩展,ApplicationContext的API更加方便使用继承关系和扩展关系

联系:ApplicationContext封装BeanFactory
在这里插入图片描述

区别:Bean的初始化时机不同,BeanFactory(懒汉)是首次调用getBean()进行创建,ApplicationContext(饱汉)是加载配置文件,容器创建就将Bean实例化初始化


Bean 实例化的基本流程

在这里插入图片描述

Spring容器在进行初始化时,会将xml配置的bean的信息封装成一个BeanDefinition对象,所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去,Spring框架在对该Map进行遍历,使用反射创建Bean实例对象,创建好的Bean对象存储在一个名为singletonObjects的Map集合中,当调用getBean方法时则最终从该Map集合中取出Bean实例对象返回

在这里插入图片描述


Bean的作用范围:默认情况下,单纯的Spring环境Bean的作用范围有两个:SlingletonPrototype,在Spring-webmvc中还有request和session

Slingleton:单例,默认值,Spring容器创建时进行Bean的实例化,存到Spring容器内部的singletonObjects单例池中,每次getBean都是从单例池中获取相同的Bean实例

Prototype:原型,Spring容器初始化时不创建Bean实例,调用getBean时实例化Bean,每次getBean都会创建一个新的Bean的实例


Spring Bean的实例化(指的是BeanFactory内)有两种方向:构造方式实例化工厂方式实例化

其中工厂方式实例化时,又可以区分几种类型:静态工厂方式非静态工厂实现FactoryBean接口

构造方式实例化:底层通过构造方法对Bean进行实例化,配置类路径通过反射加载通过构造方法创建

public class PeopleServiceImpl implements PeopleService {

    public String name;

    public PeopleServiceImpl() {
    }

    public PeopleServiceImpl(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

        <bean id="peopleService" class="com.service.impl.PeopleServiceImpl">
            <constructor-arg name="name" value="Wang"></constructor-arg>
        </bean>

获取时直接调用getBean()方法,里面指定peopleService信息

静态工厂方式:单例池中Key为工厂名,value为Bean对象

public class MyBeanFactory {

    public static PeopleServiceImpl peopleService(){
        return new PeopleServiceImpl();
    }
}
<bean id="myBeanFactory" class="com.factory.MyBeanFactory" factory-method="peopleService"></bean>

获取时直接调用getBean()方法,里面指定myBeanFactory信息

非静态工厂:bean.xml中配置两个,单例池中存在两个

public class MyBeanFactory2 {

    public PeopleServiceImpl peopleService(){
        return new PeopleServiceImpl();
    }
}

        <bean id="myBeanFactory2" class="com.itheima.factory.MyBeanFactory2"></bean>

        <bean id="peopleService2" factory-bean="myBeanFactory2" factory-method="peopleService"></bean>

获取时直接调用getBean()方法,里面指定peopleService2信息

实现FactoryBean接口:在getBean()时创建,即延迟创建

public class MyBeanFactory3 implements FactoryBean {


    public Object getObject() throws Exception {
        return new PeopleServiceImpl();
    }

    public Class<?> getObjectType() {
        return PeopleServiceImpl.class;
    }
}

        <bean id="myBeanFactory3" class="com.itheima.factory.MyBeanFactory3"></bean>

通过断点观察发现Spring容器创建时,FactoryBean被实例化了,并存储到了单例池singletonObjects中,但是getObject() 方法尚未被执行,PeopleServiceImpl也没被实例化,当首次用到PeopleServiceImpl时,才调用getObject() ,此工厂方式产生的Bean实例不会存储到单例池singletonObjects中,会存储到 factoryBeanObjectCache 缓存池中,并且后期每次使用到PeopleService都从该缓存池中返回的是同一个PeopleService实例

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

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

相关文章

【数据结构】树与二叉树

目录 树的定义 二叉树的定义 二叉树的性质 满二叉树 完全二叉树 二叉树的存储结构 顺序存储结构 链式存储结构 遍历二叉树&#xff08;递归&#xff09; 二叉树的层次遍历 先序创建二叉树 复制二叉树 销毁二叉树 写在最后 树的定义 树是n个结点的有限集&#xf…

微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面

微信小程序中生成普通二维码&#xff0c;并根据二维码里的参数跳转对应的页面1.打开[微信公众平台](https://mp.weixin.qq.com/)使用encodeURIComponent()对参数进行转码第一步&#xff1a;对要传递的参数进行编码第二步&#xff1a;生成二维码第三步&#xff1a;小程序中转页面…

电子元器件B2B电商平台建设方案:优化企业商流,拓宽B2B交易渠道

随着5G、汽车电子、物联网等新兴产业的发展&#xff0c;促进了相关电子元器件的市场需求快速增长。根据工信部预计&#xff0c;2023年我国电子元器件销售总额将达到2.1万亿元。而在互联网高速发展的今天&#xff0c;电子元器件交易在线化是必然趋势&#xff0c;B2B电子元器件线…

maven学习:引入

你是否早已厌倦了日复一日的手工构建工作&#xff1f;你是否对各个项目风格迥异的构建系统感到恐惧&#xff1f;Maven——Maven 的正确发音是[ˈmevən]&#xff0c;而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语&#xff0c;代表专家、内行的意思。这一Java社…

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。 假设要预测其中一个变量。比如&#xff0c;sparkling wine。如何建立一个模型来进行预测呢&#xff1f; 一种常见的方法是将该变量其视为单变量时间序列。这样就有很多方法可以…

【从零开始学微服务】04.微服务架构的特点

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 微服务架构被技术大牛们总结出了以下九个特点&#xff1a; 服务组件化围绕业务功能产品而不是项目强终端弱管道去中心化管理去中心化数据管理基础设施自动化容错性设计演进式设计…

Python 快速入门

文章目录Python 快速入门1 环境配置1.1 简介1.2 Python 安装1.3 其余软件1.4 编辑器的使用2 基础语法2.1 特点2.2 代码块2.3 注释3 数据类型3.1 变量类型3.2 数据结构3.3 运算符3.3.1 逻辑运算符3.3.2 比较运算符3.3.3 算术运算符3.3.4 布尔运算符4 流程语句4.1 循环语句4.1.1 …

Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)

需要全部源码或运行有问题请点赞关注收藏后评论区留言~~~ 一、通过okhttp调用HTTP接口 尽管使用HttpURLConnection能够实现大多数的网络访问操作&#xff0c;但是操作过于繁琐&#xff0c;于是Andorid从9.0是使用okhttp这个框架 由于okhttp属于第三方框架 所以使用前要修改模…

我们的程序是如何跑起来的?

1.我们写的代码写完并测试以后是如何部署给用户使用的? 1. 准备所需要的服务器 2. 在服务器上安装JDK、mysql、redis、Tomcat、Nginx等环境 3. 进行mysql、redis、nginx的连接配置 4. 项目打包。前端构建打包成功后在根目录dist文件夹中&#xff1b;后端打成jar包&#xff0c…

基于改进海洋捕食者算法求解单目标优化问题附matlab代码(NMPA)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

VLAN网络支持ipv6的交换机和虚机配置

VLAN支持ipv6的交换机和虚机配置前言一、创建VLAN网络并配置交换机1.规划并在OpenStack上创建 VLAN网络2.在交换机上配置VLAN二、Ubuntu虚机配置1.创建虚机2.在OpenStack上查看port3.登录虚机配置网卡3.1登录虚机后&#xff0c;发现虚机没获取到openstack上对应port的ipv6地址。…

Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)

一、前言 视频监控组件经历过数十年的迭代&#xff0c;从最初的只简单播放个rtsp视频流&#xff0c;到现在支持各种音频视频文件格式&#xff08;mp3、wav、mp4、asf、rm、rmvb、mkv等&#xff09;、支持各种视频流格式&#xff08;rtp、rtsp、rtmp、http等&#xff09;、支持…

10个JavaScript常见高级知识点

今天&#xff0c;给大家分享的是一篇干货知识《10个JavaScript常见高级知识点》&#xff0c;主要针对初级前端和想要面试找工作的同学&#xff0c;想要学好前端&#xff0c;除了要掌握JavaScript的基础知识外&#xff0c;还需要掌握一些高级的知识点。 学会了下面这些常见的高…

鼠标经过图片在边框内放大动效

鼠标没有经过&#xff1a; 鼠标经过的时候&#xff0c;看图&#xff0c;应该可以看出变化吧&#xff01;图有放大的效果。 样式&#xff1a;图片由一个盒子包着&#xff0c;盒子加上overflow:hidden的样式&#xff0c;即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

JavaWeb开发之——数据库设计(20)

一 概述 数据库设计-简介数据库设计-多表关系实现数据库设计-案例 二 数据库设计-简介 2.1 软件的研发步骤 2.2 数据库设计概念 数据库设计就是根据业务系统的具体需求&#xff0c;结合我们所选用的DBMS(Database Management System-数据库管理系统)&#xff0c;为这个业务系…

运动哪种耳机好用,推荐五款适合运动的耳机分享

​经常佩戴耳机的小伙伴都知晓传统的蓝牙耳机相对于有线耳机来说比较方便&#xff0c;但也存在着耳道一直堵塞导致细菌的滋生等因素的存在&#xff0c;但在近些年火热的骨传导耳机却能够将这些问题一一化解&#xff0c;基本可以说是百利而无一害&#xff0c;所以今天我就给小伙…

第一章 计算机系统体系结构

1.1 什么是计算机体系结构 本章的第一个概念是计算机系统(computer system)。 计算机系统包括读取并执行程序的 中央处理单元(CPU&#xff0c; 保存程序和数据的存储器以及将芯片转换为实用系统的 其他子系统。 这些子系统会使CPU与显示器、打印机、Internet等外部设备之间的…

【优化求解】整数规划求解机票超售优化赔付问题【含Matlab源码 2182期】

⛄一、问题 A航空公司每天有6班航班从上海到北京&#xff0c;从上午10点到晚上8点&#xff0c;每两小时发一班航班。某天获知&#xff0c;前三班机每班可以容纳100名旅客&#xff0c;后三班机每班可以容纳150名旅客。如果某次航班超售&#xff0c;A航空公司可以把某预定了该次…

【JSP/Servlet】基于WEB的通讯录系统

巩固JSP/Servlet系统开发描述步骤系统功能描述一、创建一个登录页面二、模拟数据&#xff08;用数据库模拟用户名和密码还有用户的通讯录&#xff09;三、创建一个JDBC工具类四、判断在登录页面输入的用户名和密码是否正确五、利用cookie实现保存六、以表格形式显示出我的通讯录…

2022最新MySQL面试题-有详细完整的答案解析

MySQL专题面试题 MySQL中有哪些存储引擎&#xff1f; InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎&#xff0c;也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务&#xff0c;应该优先考虑InnoDB引擎。 MylSAM存储引擎 在MySQL 5.1及之前的…