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

Spring中Bean的四种实例化方法

Bean的四种实例化方法

Bean是Spring核心的概念,另外一个核心的概念是AOP。官网上,Bean的解释是:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
翻译:
在Spring中,构建应用程序主干并且由Spring IoC容器管理的对象被称为beans,bean是一个由Spring容器实例化,组装和管理的对象。

本文是在学习B站up主动力学习Spring课程后总结得出的,主要关注Spring中Bean的实例化部分,主要介绍的就是它的四种实例化方法。

1.通过构造方法实例化

默认情况下,会调用Bean的无参数构造方法。
首先定义一个带构造方法的类。

public class User {public User() {System.out.println("User类的无参数构造方法执行。");}
}

然后在Spring的XML配置文件中定义好该类型的bean

<?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="userBean" class="com.powernode.spring6.bean.User"/>
</beans>

最后就能加载XML配置文件初始化Bean了,注意,该bean对象的实例化是在加载XML配置文件时就实例化完成了。后续只是获取该实例化好的对象。

public class SpringInstantiationTest {@Testpublic void testConstructor(){//该Bean对象在这里就实例化完成ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");//这里只是获取该BeanUser user = applicationContext.getBean("userBean", User.class);System.out.println(user);}
}

运行结果:
在这里插入图片描述

2.通过简单工厂模式实例化

第一步:定义一个不带构造方法的Bean:

public class Vip {
}

第二步:定义简单工厂方法中的工厂类

public class VipFactory {//注意简单工厂方法定义的是静态方法,方便直接被调用。public static Vip get(){return new Vip();}
}

第三步:在Spring配置文件中创建该Bean方法,使用factory-method属性指定方法

<bean id="vipBean" class="com.powernode.spring6.bean.VipFactory" factory-method="get"/>

最后就可以通过加载Spring的XML配置文件获取该bean对象。

@Test
public void testSimpleFactory(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Vip vip = applicationContext.getBean("vipBean", Vip.class);System.out.println(vip);
}

3.通过factory-bean实例化

这种方式本质上是通过工厂方法模式来实例化。
第一步:定义一个Bean

public class Order {
}

第二步:定义具体工厂类,工厂类中定义实例方法。

public class OrderFactory {public Order get(){return new Order();}
}

第三步:要使用工厂类来获取目标bean,因为工厂类是具体类,所以要使用其中的方法就要先有该类的实例对象,这里就先将该工厂类定义成一个Bean,再通过调用其中的方法获取目标Order这个Bean出来。下面是Spring的XML配置文件。

<bean id="orderFactory" class="com.powernode.spring6.bean.OrderFactory"/>
<bean id="orderBean" factory-bean="orderFactory" factory-method="get"/>

最后测试:

@Test
public void testSelfFactoryBean(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Order orderBean = applicationContext.getBean("orderBean", Order.class);System.out.println(orderBean);
}

4.通过FactoryBean接口实例化

以上的第三种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。
在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。
factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。
第一步:定义一个Bean

public class Person {
}

第二步:编写一个工厂方法类实现FactoryBean接口,表面该工厂是一个Bean工厂。并主要重写其中的getObject()方法,并且如果要在创建对象之前有什么逻辑需求,也就可以在这个getObject()方法返回前进行添加。

public class PersonFactoryBean implements FactoryBean<Person> {@Overridepublic Person getObject() throws Exception {return new Person();}@Overridepublic Class<?> getObjectType() {return null;}@Overridepublic boolean isSingleton() {// true表示单例// false表示原型return true;}
}

第三步:这时,就只要在Spring XML配置文件中配置一个FactoryBean就好了。Spring会自动识别出它实现了FactoryBean接口,并调用其中的getObject方法。

<bean id="personBean" class="com.powernode.spring6.bean.PersonFactoryBean"/>

以上,就是Bean的四种实例化方式,感谢“动力节点”的教学。

相关文章:

Spring中Bean的四种实例化方法

Bean的四种实例化方法 Bean是Spring核心的概念&#xff0c;另外一个核心的概念是AOP。官网上&#xff0c;Bean的解释是&#xff1a; In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans…...

Office word打开加载比较慢处理方法

1.添加safe参数 ,找到word启动项,右击word,选择属性 , 添加/safe , 应用并确定 2.取消加载项,点击文件,点击选项 ,点击加载项,点击转到,取消所有勾选,确定。...

一台服务器将docker image打包去另一天服务器安装这个镜像

一台服务器将docker image打到去另一天服务器安装这个镜像 1. 打包2.另一台服务器执行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一台服务器执行 docke…...

在局域网中连接Grafana数据源

目录 登录Grafana 添加数据源 配置数据源 保存并测试 使用数据源 注意事项 登录Grafana 打开浏览器&#xff0c;访问Grafana的地址&#xff0c;默认是http://localhost:3000。 使用默认用户名和密码登录&#xff08;通常是admin/admin&#xff09;&#xff0c;登录后建议…...

深入理解指针1

深入理解指针1 一.内存和地址以及指针间的关系 举一个生活中的例子&#xff0c;假如你去找你的朋友玩&#xff0c;你的朋友告诉了你酒店的名字&#xff0c;但是没有告诉告诉你他具体住哪一件房间&#xff0c;于是你为了找到你的朋友&#xff0c;只好一间房间一间房间的去找&am…...

使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频

如何使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频 声明 该播客仅提供实现思路,并非实际的方案记录,不要盲目照搬。 pjsua2库的安装会有较多问题,请参考本人之前的播客进行安装 pjsua2。 pjsua2 库具体的 api 说明请参考开源库内的 范例代码。 引言 在今天的…...

【部署优化篇四】《DeepSeek移动端优化:CoreML/TFLite实战对比》

手机里的AI助手能秒速回答你的问题,游戏人物能实时追踪你的表情变化,这些酷炫功能的背后都离不开移动端机器学习框架的支撑。今天我们就来撕开两个当红炸子鸡框架CoreML和TFLite的神秘面纱,看看它们在模型优化这件事上到底藏着哪些独门绝技。 一、移动端优化的生存法则 在…...

【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略

文章目录 一、分表分库1. 数据分表的必要性与方式2. 数据分库原则与优势 二、主从复制1. 读写分离架构设计2. 数据复制方式3. MySQL实现主从复制4. MySQL主从复制实践与高可用方案 三、数据扩容 随着业务的不断发展和数据量的增长&#xff0c;传统的单机关系型数据库已经逐渐不…...

【嵌入式Linux应用开发基础】特殊进程

目录 一、守护进程&#xff08;Daemon Process&#xff09; 1.1. 概念 1.2. 特点 1.3. 守护进程的命名 1.4. 创建守护进程的步骤 1.5. 守护进程的实例 1.6. 守护进程的管理 1.7. 影响与处理 二、僵尸进程&#xff08;Zombie Process&#xff09; 2.1. 僵尸进程的定义…...

HDFS应用-后端存储cephfs-java-API

HDFS(Hadoop Distribute FileSystem)是一个适合运行在通用硬件之上,具备高度容错特性,支持高吞吐量数据访问的分布式文件系统,非常适合大规模数据集应用。 HDFS适用于如下场景: • 处理海量数据(TB或PB级别以上) • 需要很高的吞吐量 • 需要高可靠性 • 需要很好的可扩…...

复现log4j2的jndi注入成功反弹shell

在Apache Solr 中复现log4j2的jndi注入漏洞&#xff0c;获得docker容器的root权限&#xff0c;实验五步走&#xff1a; 启动容器访问web页面漏洞探测反弹shell载荷wireshark抓取log4j反弹shell流量 ailx10 1956 次咨询 4.9 网络安全优秀回答者 互联网行业 安全攻防员 去咨…...

Cursor实战:Web版背单词应用开发演示

Cursor实战&#xff1a;Web版背单词应用开发演示 需求分析自行编写需求文档借助Cursor生成需求文档 前端UI设计后端开发项目结构环境参数数据库设计安装Python依赖运行应用 前端代码修改测试前端界面 测试数据生成功能测试Bug修复 总结 在上一篇《Cursor AI编程助手不完全指南》…...

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统&#xff0c;报错&#xff1a;Operating System not found 二、原因分析 国产系统&#xff0c;需要注意的点&#xff1a; 需要看你的系统类…...

python subprocess库

subprocess subprocess 是 Python 标准库中的一个模块&#xff0c;用于创建和管理子进程。它允许你在 Python 程序中执行外部命令、调用其他程序&#xff0c;并与这些程序进行交互。subprocess 模块提供了丰富的功能&#xff0c;可以替代一些旧的模块和函数&#xff0c;如 os.…...

敏捷项目管理:适应快速变化的项目环境

一、敏捷项目管理的核心逻辑 敏捷项目管理是一种以迭代开发、快速响应变化、持续交付价值为核心的方法论&#xff0c;尤其适合需求频繁变更或市场环境不确定的项目。它的核心逻辑是**“小步快跑”**——将大目标拆解为多个短期可交付的成果&#xff0c;通过持续反馈和调整&…...

矿用机车移动逆变电源设计(论文+源码)

1总体方案设计 本课题为矿用机车移动逆变电源的硬件电路设计&#xff0c;其整个架构如图2.1所示包括了:380V三相交流电&#xff0c;逆变电路&#xff0c;高频变压器&#xff0c;24V直流输出&#xff0c;控制电路&#xff0c;驱动电路&#xff0c;保护电路等等。 在工作原理上&…...

前七章综合练习

一&#xff0c;拓扑图 二&#xff0c;实验要求 不限 三&#xff0c;实验步骤 第一步&#xff0c;搭建拓扑图 如上 注意&#xff1a; 第二步&#xff0c;配置IP trust&#xff1a; client1 client2 fw untrusrt-1&#xff1a; fw r3 电信DNS 百度web-1 untrust-2&#xf…...

二级指针略解【C语言】

以int** a为例 1.二级指针的声明 a 是一个指向 int*&#xff08;指向整型的指针&#xff09;的指针&#xff0c;即二级指针。 通俗的讲&#xff0c;a是一个指向指针的指针&#xff0c;对a解引用会是一个指针。 它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针…...

环境变量2

目录 环境变量PATH 如何改变PATH 我们今天继续来学习环境变量2&#xff01;&#xff01;&#xff01; 环境变量PATH PATH的作用是知道命令的搜索路径&#xff0c;我们都知道Linux上的命令行指令&#xff0c;ll&#xff0c;pwd什么的为什么我们写出来系统就知道是什么并且运…...

GoFound 与 MySQL 集成优化方案

GoFound 与 MySQL 集成优化方案 1. 明确需求 文章信息存储在 MySQL 数据库中。使用 GoFound 实现全文搜索功能。搜索时&#xff0c;先从 GoFound 中获取匹配的文章 ID&#xff0c;然后从 MySQL 中查询完整的文章信息。 2. 优化思路 数据同步&#xff1a;将 MySQL 中的文章数…...

数据录入与处理岗位

随着人工智能技术的迅猛发展&#xff0c;DeepSeek等先进AI系统正在逐步渗透到各个行业&#xff0c;工控行业也不例外。工控行业作为工业自动化的核心领域&#xff0c;涵盖了从生产线控制到设备维护的多个环节。然而&#xff0c;随着AI技术的不断进步&#xff0c;一些传统岗位正…...

cs106x-lecture11(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture11 (以下皆使用SPL实现&#xff0c;非STL库&#xff0c;后续课程结束会使用STL实现) 1、diceRolls Write a recursive function named diceRolls accepts an integer representing a number of 6-sided dice to roll, and output all possibl…...

基于ffmpeg+openGL ES实现的视频编辑工具(一)

在深入钻研音视频编辑开发这片技术海洋时&#xff0c;相信不少开发者都和我有同样的感受&#xff1a;网络上关于音视频编辑工具实现的资料繁多&#xff0c;理论阐释细致入微&#xff0c;代码片段也随处可见。然而&#xff0c;一个显著的缺憾是&#xff0c;缺乏一个完整成型的 A…...

全面掌握Python时间处理

全面掌握Python时间处理 flyfish datetime: 最适合处理日期和时间&#xff0c;支持创建时间对象、格式化时间、计算时间差等。time: 提供了获取时间戳、将时间戳转换为本地时间、暂停程序执行等功能。timeit: 主要用于性能测试&#xff0c;帮助开发者了解某段代码的执行效率。…...

LLM 推理中推理-时间计算技巧

25年2月来自香港科技大学广州分校的论文“Bag of Tricks for Inference-time Computation of LLM Reasoning”。 随着大语言模型 (LLM) 的进步&#xff0c;解决复杂的推理任务越来越受到关注。推理-时间计算方法&#xff08;例如 Best-of-N、波束搜索等&#xff09;特别有价值…...

matplotlib 如何是的横坐标纵向显示

在 ​​matplotlib​​​ 中&#xff0c;若要让横坐标标签纵向显示&#xff0c;可以使用 ​​plt.xticks()​​​ 或 ​​ax.set_xticklabels()​​ 方法结合旋转参数来实现。 方法一&#xff1a;使用 ​​plt.xticks()​​ 当你使用 ​​matplotlib​​​ 的 pyplot 接口&am…...

Go日期时间处理工具Carbon

**注意&#xff1a;**本文大部分内容摘抄自-https://github.com/dromara/carbon/blob/master/README.cn.md使用文档 一、简介 一个轻量级的、易于使用的、语义智能的日期时间处理库&#xff0c;支持链式调用&#xff0c;已被 awesome-go 收录&#xff0c;现已经捐赠给了 drom…...

【Spring生命周期】Bean元信息配置阶段

引言 本系列将详细讲解Spring生命周期的13个阶段&#xff0c;从源码角度帮助我们更好的理解Spring框架和bean生命周期全流程 Bean信息定义4种方式 API的方式Xml文件方式properties文件的方式注解的方式 在 Spring 框架中&#xff0c;Bean 元信息配置阶段是整个 Bean 生命周…...

linux有名管道的文件描述符3和4

在使用有名管道&#xff08;Named Pipe&#xff0c;FIFO&#xff09;时&#xff0c;返回的文件描述符 3 和 4 是通过 open() 系统调用打开有名管道后分配的文件描述符。文件描述符是进程用来访问打开的文件或管道的整数标识符。 1. 文件描述符的分配规则 文件描述符是一个非负整…...

Mobaxterm: Local port forwarding Remote port forwarding

文章目录 Remote port forwardingLocal port forwardingAppendix: Deploy clash in docker Remote port forwarding If you want to share the proxy on your local machine with the remote server, use Remote port forwarding. Consider this scenario: There is no proxy…...