当前位置: 首页 > news >正文

Spring:IOC实例化对象bean的方式

对象已经能交给Spring的IOC容器来创建了,但是容器是如何来创建对象的呢?

就需要研究下bean的实例化过程,在这块内容中主要解决两部分内容,分别是

  • bean是如何创建的
  • 实例化bean的三种方式,构造方法,静态工厂实例工厂

在讲解这三种创建方式之前,我们需要先确认一件事:

bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。

基于这个知识点出发,我们来验证spring中bean的三种创建方式。

1 构造方法实例化

内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见Spring底层用的是反射:

编写java 类
public interface BookDao {public void save();
}public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}}

将类配置到Spring容器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/></beans>

编写运行程序

public class AppForInstanceBook {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
}

在这里插入图片描述
由此可知,说明Spring容器在创建对象的时候也走的是构造函数,且在容器启动的时候就创建

2,实例工厂与FactoryBean

(1)准备一个UserDao和UserDaoImpl类

public interface UserDao {public void save();
}public class UserDaoImpl implements UserDao {public void save() {System.out.println("user dao save ...");}
}

(2)创建一个工厂类userDaoFactory并提供一个普通方法,注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法

public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}

(3实例工厂实例化配置

<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

实例化工厂运行的顺序是:

  • 创建实例化工厂对象,对应的是第一行配置

  • 调用对象中的方法来创建bean,对应的是第二行配置

    • factory-bean:工厂的实例对象

    • factory-method:工厂对象中的具体创建对象的方法名,对应关系如下:
      在这里插入图片描述
      factory-mehod:具体工厂类中创建对象的方法名

(4)在AppForInstanceUser运行类,使用从IOC容器中获取bean的方法进行运行测试

public class AppForInstanceUser {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao) ctx.getBean("userDao");userDao.save();}
}

(5)运行后,可以查看到结果
在这里插入图片描述

4.2.3.3 FactoryBean的使用

上述实例工厂实例化的方式配置的过程还是比较复杂,所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发。
具体的使用步骤为:
(1)创建一个UserDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法

public class UserDaoFactoryBean implements FactoryBean<UserDao> {//代替原始实例工厂中创建对象的方法@Overridepublic UserDao getObject() throws Exception {// 实际创建并返回 UserDao 实例的地方return new UserDao();}@Overridepublic Class<?> getObjectType() {// 返回由这个工厂创建的对象的类型return UserDao.class;}@Overridepublic boolean isSingleton() {// 指定是否每次调用都返回同一个实例return true;}
}

解释:
在Java中,Class<?> 是一个泛型类型,表示未知类型的类。当你使用 return UserDao.class; 这样的语句时,你实际上是在返回一个代表 UserDao 类的 Class 对象。
在这个例子中,UserDaoFactory 类实现了 FactoryBean 接口,并重写了 getObjectType() 方法来指定它生产的对象是 UserDao 类型的。这样,当其他代码通过工厂获取对象时,它们可以知道应该期待什么类型的对象。

(2)在Spring的配置文件中进行配置

<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>

(3)AppForInstanceUser运行类不用做任何修改,直接运行

在这里插入图片描述
这种方式在Spring去整合其他框架的时候会被用到,所以这种方式需要大家理解掌握。

查看源码会发现,FactoryBean接口其实会有三个方法,分别是:

T getObject() throws Exception;Class<?> getObjectType();default boolean isSingleton() {return true;
}

方法一:getObject(),被重写后,在方法中进行对象的创建并返回

方法二:getObjectType(),被重写后,主要返回的是被创建类的Class对象

方法三:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默认true,也可以重写成fause。但是一般情况下我们都会采用单例,也就是采用默认即可。所以isSingleton()方法一般不需要进行重写。

bean实例化小结

Spring的IOC实例化对象的三种方式分别是:

  • 构造方法(常用)
  • 静态工厂(了解)
  • 实例工厂(了解)
    • FactoryBean(实用)

这些方式中,重点掌握构造方法FactoryBean即可。

需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。

[说明]:内容主要来源黑马程序员网上资源学习

相关文章:

Spring:IOC实例化对象bean的方式

对象已经能交给Spring的IOC容器来创建了&#xff0c;但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程&#xff0c;在这块内容中主要解决两部分内容&#xff0c;分别是 bean是如何创建的实例化bean的三种方式&#xff0c;构造方法,静态工厂和实例工厂 在讲解这…...

深入解析生成对抗网络(GAN)

1. 引言 背景介绍 在过去的几十年中&#xff0c;深度学习在计算机视觉、自然语言处理和语音识别等领域取得了巨大的突破。然而&#xff0c;如何让机器生成高质量、逼真的数据一直是人工智能领域的挑战。传统的生成模型&#xff0c;如变分自编码器&#xff08;VAE&#xff09;…...

curl命令提交大json

有个客户需要提交一个4M左右的pdf&#xff0c;接口里传的是pdf字节流base64编码后的字符串。 直接curl -XPOST -d json串 api接口会报 参数过长报错Argument list too long 网上搜了下解决方案把json串放到文本里然后通过json.txt引入参数 这一试不要紧&#xff0c;差点儿导致…...

以太坊拥堵扩展解决方案Arbitrum

Arbitrum是一种用于以太坊的Layer 2&#xff08;L2&#xff09;扩展解决方案&#xff0c;以下是详细介绍&#xff1a; 1. 背景和基本原理 背景介绍&#xff1a;随着以太坊网络的发展&#xff0c;交易拥堵和高Gas费用的问题逐渐凸显。为了解决这些问题&#xff0c;Layer 2扩展…...

Kafka新节点加入集群操作指南

一、环境准备 1. Java环境安装 # 安装JDK apt-get update apt-get install openjdk-8-jdk -y2. 下载并解压 wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.13-2.8.1.tgz tar xf kafka_2.13-2.8.1.tgz mv kafka_2.13-2.8.1 kafka二、配置环境变量 1. 创建kafka…...

【Android compose原创组件】在Compose里面实现内容不满一屏也可以触发边界阻尼效果的一种可用方法

创意背景 在安卓 View 传统命令式开发里面提供了非常多稳定美观体验好的组件&#xff0c;但是目前Compose还未有可用的组件&#xff0c;比如View中可以使用 coordinatorlayout 的滚动效果可以实现局部&#xff08;即使内容不满一屏也可以触发滚动边界阻尼效果&#xff09;&…...

介绍一下struct(c基础)

struct 是命名结构体的&#xff0c;可以看成集合。不同元素即是表达一个对象的不同方面属性。 格式 struct stu (一种标识符) { //命名不可初始化 [元素类型] 元素名; char 元素1[n]; int 元素2; int 元素3; __________ int 元素n; }; struct stu {//…...

模型压缩——基于粒度剪枝

1.引言 模型剪枝本质上是一种利用稀疏性来减少模型大小和计算量&#xff0c;从而提高训练和推理效率的技术。它为何会有效呢&#xff1f; 理论依据&#xff1a;有研究发现&#xff0c;在许多深度神经网络中&#xff0c;大部分参数是接近于0的&#xff0c;这些参数对模型最终的…...

IntelliJ IDEA 2023.2x——图文配置

IntelliJ IDEA 2023.2——配置说明 界面如下图所示 : 绿泡泡查找 “码猿趣事” 查找【idea99】 IntelliJ IDEA 的官方下载地址 IntelliJ IDEA 官网下载地址 一路上NEXT 到结尾&#xff1a; 继续NEXT 下一步:...

SpringBoot(5)-SpringSecurity

目录 一、是什么 二、实战测试 2.1 认识 2.2 认证和授权 2.3 权限控制和注销 2.4 记住我 一、是什么 Spring Security是一个框架&#xff0c;侧重于为java应用程序提供身份验证和授权。 Web应用的安全性主要分为两个部分&#xff1a; 认证&#xff08;Authentication&…...

fast-api后端 + fetch 前端流式文字响应

fast-api后端 fetch 前端流式文字响应 fast-api后台接口流式响应 前端fetch 流式文本数据处理 fast-api后台接口 流式响应 from fastapi.responses import StreamingResponse from tqdm import tqdm from pydantic import BaseModelclass ItemDataSingle(BaseModel):data: …...

Qt 的 QThread:多线程编程的基础

Qt 的 QThread&#xff1a;多线程编程的基础 在现代应用程序中&#xff0c;尤其是需要处理大量数据、进行长时间计算或者进行 I/O 操作时&#xff0c;多线程编程变得至关重要。Qt 提供了一个功能强大且易于使用的线程类 QThread&#xff0c;可以帮助开发者在 Qt 应用程序中实现…...

周末总结(2024/11/16)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…...

Chrome和Chromium的区别?浏览器引擎都用的哪些?浏览器引擎的作用?

Chrome和Chromium的区别? Chrome是Google专属的产品&#xff0c;它是基于后者Chromium开源引擎开发。第三方浏览器公司为了加快开发流程&#xff0c;会直接选择开源的浏览器引擎&#xff0c;例如Chromium. Google将Chromium开源&#xff0c;本意为了打破浏览器被其他公司控制的…...

流程图图解@RequestBody @RequestPart @RequestParam @ModelAttribute

RequestBody 只能用一次&#xff0c;因为只有一个请求体 #mermaid-svg-8WZfkzl0GPvOiNj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8WZfkzl0GPvOiNj3 .error-icon{fill:#552222;}#mermaid-svg-8WZfkzl0GPvOiNj…...

AutoUpdater.NET 实现 dotNET应用自动更新

AutoUpdater.NET 是一款用于WPF、Winform软件版本更新的框架&#xff0c;类似框架还有Squirrel、WinSparkle、NetSparkle、Google Omaha。 一、安装AutoUpdater.NET 首先&#xff0c;您需要在项目中安装AutoUpdater.NET库。您可以通过NuGet包管理器来安装它。在Visual Studio中…...

108. UE5 GAS RPG 实现地图名称更新和加载关卡

在这一篇里&#xff0c;我们将实现对存档的删除功能&#xff0c;在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置&#xff0c;我们可以通过存档进入游戏&#xff0c;玩家在游戏中可以在存档点存储存档。 实现删除存档 删除存档需要一个弹框确认&#xff0…...

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密&#xff1a;密码学的基石及 RSA 算法详解 在当今数字化的时代&#xff0c;信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术&#xff0c;为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…...

排列问题方法总结(递归+迭代)

递归 一、逐步生成结果法&#xff08;无序&#xff09; #include<iostream> #include<vector> #include<string> #include<algorithm>using namespace std;vector<string> GetChild(int n,int curIndex){vector<string> now;vector&…...

C#从入门到放弃

C#和.NET的区别 C# C#是一个编程语言 .NET .NET是一个在window下创建程序的框架 .NET框架不仅局限于C#,它还可以支持很多语言 .NET包括了2个组件&#xff0c;一个叫CLR(通用语言运行时)&#xff0c;另一个是用来构建程序的类库 CLR 用C写一个程序&#xff0c;在一台8688的机器…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...