Spring底层原理之FactoryBean Bean工厂 单例对象 多例对象

FactoryBean

在 Spring Framework 中,FactoryBean 是一个用于创建其他 Bean 实例的特殊工厂 Bean。它允许开发者自定义 Bean 的创建逻辑,从而更加灵活地管理和配置 Bean 的实例化过程。

FactoryBean 接口

FactoryBean 接口是 Spring 框架中的一个重要接口,它定义了两个方法:

  1. getObject():这个方法负责返回由工厂创建的 Bean 的实例,可以是任意的对象,不限于特定的类或接口。

  2. getObjectType():这个方法返回由工厂创建的 Bean 的类型。如果工厂创建的对象不是一个明确的类,可以返回 null。

我们在当前包下创建一个新的类

Factory工厂

这个bean有创建对象的功能

我们要去实现一个接口

package com.bigdata1421.bean;import org.springframework.beans.factory.FactoryBean;public class DogFactoryBean implements FactoryBean<Dog> {@Overridepublic Dog getObject() throws Exception {return null;}@Overridepublic Class<?> getObjectType() {return null;}
}

这个类的作用是为了创建另一个对象

创建泛型对象

package com.bigdata1421.bean;import org.springframework.beans.factory.FactoryBean;public class DogFactoryBean implements FactoryBean<Dog> {//写当前工厂造出来的bean是什么@Overridepublic Dog getObject() throws Exception {return new Dog();}//问造出来的是什么类型@Overridepublic Class<?> getObjectType() {return Dog.class;}@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}}

FactoryBean类一旦被spring容器加载

造出来的对象不是他自身

而是他的泛型类型

意思就是提前利用工厂bean做好对bean的初始化 提前声明好后方便服务层注入使用

实现

package com.bigdata1421.config;import com.bigdata1421.bean.Dog;
import com.bigdata1421.bean.DogFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;@ComponentScan({"com.bigdata1421.bean","com.bigdata1421.config"})
public class SpringConfig3 {@Beanpublic DogFactoryBean dog(){return new DogFactoryBean();}}

小结

在 Spring Framework 中,单例对象(Singleton)是一种被 Spring 容器管理的对象实例化方式,具有以下特点和意义:

  1. 单例模式特性

    • 当一个 Bean 被定义为单例时,Spring 容器将会在应用程序的生命周期中,只创建该 Bean 的一个实例。

    • 每次请求该 Bean 时,Spring 都会返回同一个实例对象。

  2. 作用

    • 性能优化:单例模式减少了对象的创建和销毁次数,因此可以提升应用程序的性能,特别是当一个 Bean 的创建成本较高时,比如涉及到数据库连接、网络连接等资源。

    • 对象共享:保证应用中各个部分使用的是同一个实例,确保数据的一致性和状态的统一性。

    • 配置简化:通过单例模式,避免了手动管理对象的生命周期和状态,Spring 容器负责管理对象的创建、依赖注入和销毁,简化了配置和代码的复杂度。

  3. 默认行为

    • 在 Spring 中,如果没有显式地指定作用域(Scope),默认情况下 Bean 是单例的。这意味着大多数情况下,当你使用 @Component 或其衍生注解(如 @Service@Repository@Controller)标记一个类时,Spring 将会把它作为单例 Bean 注册到容器中。

  4. 注意事项

    • 单例 Bean 应该是状态无关的,或者在设计上避免状态共享,以避免潜在的并发问题。

    • 如果一个 Bean 需要维护状态,应该设计成原型(Prototype)作用域,这样每次注入或请求时都会创建一个新的实例。

多例对象

在 Spring Framework 中,除了单例对象(Singleton)之外,还可以定义多实例对象(Prototype)。多实例对象的特点是,每次获取该 Bean 时,Spring 容器都会创建一个新的实例,而不是返回同一个实例。

多实例对象适用于需要频繁创建和销毁的 Bean 或者需要维护状态的 Bean。通过多实例作用域,可以确保每次请求 Bean 时都会得到一个全新的实例,从而避免状态共享和并发问题。

要定义一个多实例对象,可以使用 @Scope 注解并将作用域设置为 prototype

个人号推广

博客主页

多多!-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

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

相关文章

推送电子邮箱与其他营销手段如何有效结合?

推送电子邮箱的效果如何&#xff1f;怎么优化邮件推送的策略&#xff1f; 将推送电子邮箱与其他营销手段有效结合&#xff0c;可以显著提升营销效果和用户体验。AokSend将探讨如何将推送电子邮箱与社交媒体营销、内容营销、搜索引擎优化&#xff08;SEO&#xff09;等手段相结…

ArkTS自定义组件

一、自定义组件基本结构 // 定义自定义组件 ButtonCom.ets Component export struct BtnCom{State msg: string "按钮";build() {Row(){Text(this.msg).onClick(() > {this.msg "测试"})}} } // 引入自定义组件 import {BtnCom} from "./Butto…

动物常见图像的图像分类数据集

常见动物图像分类数据集 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zZnCUZuNlX6MjuZImlDjTw?pwd03b9 提取码&#xff1a;03b9 数据集信息介绍&#xff1a; 文件夹 大象 中的图片数量: 1446 文件夹 松鼠 中的图片数量: 1862 文件夹 河马 中的图片数量:…

理解和处理不同类型的上下文的新型的语言模型ReALM

在人类的日常交流中&#xff0c;模糊的代词如“他们”或“那个”常常出现&#xff0c;它们的意义通常依赖于上下文才能明确。这种上下文的理解对于对话助手来说至关重要&#xff0c;因为它们旨在提供一种自然的交流体验。然而&#xff0c;现有的对话助手在处理这类模糊引用时往…

SAP查看接口日志

大部分SAP项目都会与其他外围系统进行集成&#xff0c;那么日常工作中&#xff0c;如果遇到接口传输问题&#xff0c;我们应该怎样查询呢&#xff1f; 也许这篇文章可以稍微解答一些基础的内容。 1、事务代码SXI_MONITOR检查接口日志&#xff1a; 执行的起止日期默认带出&…

oracle11g rac静默dbca创建实例反复报监听问题

问题 处理方法 手动创建监听程序 重新静默dbca建库

Hume AI 将无比强大的情感AI聊天机器人带到了iPhone平台免费使用

总部位于美国的Hume AI研究实验室&#xff0c;致力于开发“针对人类福祉进行优化”的系统&#xff0c;最近推出了其EVI平台的iOS应用版本——名为Hume&#xff1a;您的个人人工智能。 这款新产品包括名为Kora的新型AI语音&#xff0c;以及对热门新Claude 3.5 Sonnet LLM的支持…

2024.6.25力扣刷题记录-周赛403

目录 一、3194. 最小元素和最大元素的最小平均值 二、3195. 包含所有 1 的最小矩形面积 I 三、3196. 最大化子数组的总成本 四、3197. 包含所有 1 的最小矩形面积 II 博主在比赛时只过了前两题。剩下跟着灵神做&#xff0c;来自视频&#xff1a; 【状态机 DP【力扣周赛 403…

Deepl网页版使用方法

Deepl网页版科学使用方法 Deepl 网页版使用方法重要链接使用方式一、在没有使用插件前的Deepl界面二、安装DeepL.Crack.v1.2.7插件三、插件安装后打开[Deepl官网](https://www.deepl.com/zh/translator)即可四、在翻译整篇文章的权限怎么设置 Deepl 网页版使用方法 重要链接 …

rider出现PluginException导致无法启动

目录 项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 项目场景&#xff1a; 由于deepinshot不适用于wayland&#xff0c;ubuntu自带的截图又难用的很&#xff0c;所以换了一款截图软件&#xff0c;叫flameshot&#xff0c;可支持在wayland上使…

基于SaaS平台的iHRM管理系统测试学习

目录 目录 1、登录模块 2、员工管理模块 3、Postmannewman软件的安装&#xff0c;学习 1、Postman的使用 2、Postman断言 3、全局变量和环境变量 4、请求时间戳 5、Postman关联 6、批量执行测试用例 7、Postman生成测试报告 8、Postman读取外部数据文件&#xff08…

昇思25天学习打卡营第01天|基本介绍

作为曾经的javaer&#xff0c;本着不断学习的初心&#xff0c;报名了昇思25天的课程&#xff0c;希望自己能学会点东西的目的。 昇思MindSpore介绍 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;…

【干货】Jupyter Lab操作文档

Jupyter Lab操作文档1. 使用须知2. 定制化Jupyter设置主题显示代码行数设置语言更多设置 3. 认识Jupyter界面4. 初用Jupyter运行调试格式化查看源码 5. 使用Jupyter Terminal6. 使用Jupyter Markdown7. 上传下载文件&#xff08;云服务器中的Jupyter Lab&#xff09;上传文件到…

LeetCode 算法:二叉树的层序遍历 c++

原题链接&#x1f517;&#xff1a;二叉树的层序遍历 难度&#xff1a;中等⭐️⭐️ 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念&#xff0c;将逐步规范化一个例子&#xff0c;逐级说明每个范式的要求和变换过程。 示例&#xff1a;学生课程登记系统 初始…

【Docker】容器

目录 1. 容器启动 2. 容器启动/重启/停止 3. 进入容器 4. 容器查询 5. docker 镜像的构建 方式一&#xff1a;docker 容器 commit 方式二&#xff1a;Dockerfile 定制镜像 1. 容器启动 docker run –it/-d –p/P –name imageID/name 2. 容器启动/重启/停止 docker sta…

Linux-笔记 全志T113移植正点4.3寸RGB屏幕笔记

目录 前言 线序整理 软件 显示调试 触摸调试 背光调试 前言 由于手头有一块4.3寸的RGB屏幕(触摸IC为GT1151)&#xff0c;正好开发板上也有40Pin的RGB接口&#xff0c;就想着给移植一下&#xff0c;前期准备工作主要是整理好线序&#xff0c;然后用转接板与杜邦线连接验证好…

vue3+ts:监听dom宽高变化函数

一、效果展示 二、代码 getSize.ts import { ref, Ref, watchEffect } from "vue";export const getWidth (domRef: Ref<HTMLElement | null>) > {const width ref<number>(0);const height ref<number>(0);const observer new ResizeObs…

Qt事件传递顺序是怎样的?

1、事件传递顺序规则 在Qt中&#xff0c;事件传递的顺序事件首先传递到目标对象的事件过滤器&#xff0c;然后传递到事件处理函数&#xff0c;最后传递到父对象的事件过滤器和事件处理函数。 为了更好地理解这一过程&#xff0c;下面将通过一个示例来展示事件在父窗口和子窗口…

投票多功能小程序(ThinkPHP+Uniapp+FastAdmin)

&#x1f389;你的决策小助手&#xff01; 支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码。​ 一、引言&#xff1a;为什么我们需要多功能投票小程序&#…