Bean的实例化方式

1. 通过构造方法实例化(Constructor Instantiation)

这是最常见的方式,Spring通过调用类的构造方法来创建Bean实例。

XML配置示例

<bean id="userDao" class="com.example.UserDao" />
  • Spring容器在加载时调用UserDao无参构造函数进行实例化。
带参数的构造器注入

如果类没有无参构造器,需要传递参数时,可以在XML中使用<constructor-arg>标签。

<bean id="userService" class="com.example.UserService"><constructor-arg name="userDao" ref="userDao" />
</bean>

 对应的Java类:

public class UserService {private UserDao userDao;public UserService(UserDao userDao) {this.userDao = userDao;}
}

2. 通过静态工厂方法实例化(Static Factory Method)

使用静态方法创建Bean实例,适用于无法直接通过构造器创建的对象。

XML配置示例

<bean id="connection" class="com.example.ConnectionFactory" factory-method="createConnection" />

对应的Java类:

public class ConnectionFactory {public static Connection createConnection() {return new Connection();}
}

Spring容器会调用ConnectionFactory.createConnection()返回Connection对象。

3. 通过实例工厂方法实例化(Instance Factory Method)

使用已经创建的工厂实例来创建Bean。

XML配置示例

<bean id="factory" class="com.example.ConnectionFactory" /><bean id="connection" factory-bean="factory" factory-method="getConnection" />

 对应的Java类:

public class ConnectionFactory {public Connection getConnection() {return new Connection();}
}

Spring首先实例化ConnectionFactory对象,然后调用其getConnection()方法创建Connection实例。

4. 通过工厂Bean(FactoryBean接口)实例化

Spring提供了FactoryBean接口,用于更复杂的对象创建逻辑。实现此接口的类会被Spring识别为工厂。它允许开发者通过实现 FactoryBean 接口,来自定义 Bean 的实例化逻辑。当需要创建一个复杂对象或对象的创建过程需要包含一些逻辑操作时,FactoryBean 是非常有用的。

FactoryBean接口详解

FactoryBean<T> 是一个泛型接口,其中 T 是由该工厂创建的对象类型。实现 FactoryBean 接口的类可以被 Spring 容器用作工厂。其中,T 是一个泛型参数,它表示由工厂创建的对象的类型。在实现 FactoryBean 接口时,需要指定这个泛型参数的具体类型,即工厂将返回的对象的类型

以下是 FactoryBean 接口的关键方法:

  • T getObject(): 定义如何创建和返回一个 Bean 实例。
  • Class<?> getObjectType(): 返回创建的对象类型。
  • boolean isSingleton(): 返回是否创建的对象是单例模式。

Java代码

public class MyBeanFactory implements FactoryBean<MyBean> {@Overridepublic MyBean getObject() {return new MyBean();}@Overridepublic Class<?> getObjectType() {return MyBean.class;}@Overridepublic boolean isSingleton() {return true;  // 如果要让 Spring 管理它为单例,可以返回 true}
}

 XML配置

<bean id="myBean" class="com.example.MyBeanFactory" />

Spring会调用MyBeanFactorygetObject()方法,返回MyBean实例。

FactoryBean的工作原理

在 Spring 中,当你使用 <bean> 配置来定义一个实现了 FactoryBean 接口的类时,Spring 容器实际上不会直接将这个类本身作为 Bean,而是通过调用 FactoryBeangetObject() 方法来创建 Bean 实例。

BeanFactory和FactoryBean的区别

  • BeanFactorySpring IoC容器的顶级对象 ,是 Spring 的一个核心接口,负责管理和提供 Bean 的实例,是 Spring IoC 容器的基础接口。
  • FactoryBean:是一个特殊的 Bean,用于创建复杂 Bean 实例。它是 Spring 框架中用来实现工厂模式的一种机制,允许自定义创建复杂对象的逻辑。总之,它是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。

BeanFactory 详细解释

  • BeanFactory 是 Spring IoC 容器的最基础接口,提供 Bean 的实例管理功能。
  • 它负责 Bean 的创建、管理和生命周期控制
  • 实现类ApplicationContextBeanFactory 的一个子接口,它在 BeanFactory 的基础上增加了更多的企业级功能,通常我们在开发中更多地使用 ApplicationContext

工作方式

  • 延迟加载:默认情况下,BeanFactory 在第一次被请求时才创建 Bean 的实例(延迟加载)。这有助于提高应用的启动速度。
  • 提供方法来获取 Bean,如 getBean(String beanName)
    BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
    MyService myService = (MyService) factory.getBean("myService");
    

FactoryBean 详细解释

  • FactoryBean 是一个实现了 FactoryBean 接口的特殊 Bean,它用于自定义创建复杂对象
  • 实现 FactoryBean 接口的类本质上是一个工厂类,Spring 通过调用 FactoryBeangetObject() 方法,来创建和管理最终的 Bean。
  • FactoryBean 提供了一种方式,可以将对象的创建细节封装到工厂中,这种方式特别适合创建需要复杂初始化过程的 Bean。

核心方法

  • getObject():返回工厂创建的对象。
  • getObjectType():返回创建的对象的类型。
  • isSingleton():指示是否创建单例实例
 FactoryBean 的应用场景:
注入自定义Date:

之前了解过:java.util.Date在Spring中被当做简单类型,简单类型在注入的时候可以直接使用value属性或value标签来完成。但对于Date类型来说,采用value属性或value标签赋值的时候,对日期字符串的格式要求非常严格,必须是这种格式的:Mon Oct 10 14:30:26 CST 2022。其他格式是不会被识别的。

Student类:

package bean;import java.util.Date;public class Student {private String name;private Date birth;public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public Student() {}public Student(String name, Date birth) {this.name = name;this.birth = birth;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", birth=" + birth +'}';}
}

如果我们想使用一下形式注入到Date类中,我们就需要使用到FactoryBean

<bean id="studentBean" class="com.powernode.spring6.bean.Student"><property name="birth" value="2002-10-10"/>
</bean>

编写DateFactoryBean实现FactoryBean接口:

package com.powernode.spring6.bean;import org.springframework.beans.factory.FactoryBean;import java.text.SimpleDateFormat;
import java.util.Date;public class DateFactoryBean implements FactoryBean<Date> {// 定义属性接收日期字符串private String date;// 通过构造方法给日期字符串属性赋值public DateFactoryBean(String date) {this.date = date;}@Overridepublic Date getObject() throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");return sdf.parse(this.date);}@Overridepublic Class<?> getObjectType() {return null;}
}

编写spring配置文件:

<bean id="dateBean" class="com.powernode.spring6.bean.DateFactoryBean"><constructor-arg name="date" value="1999-10-11"/>
</bean><bean id="studentBean" class="com.powernode.spring6.bean.Student"><property name="birth" ref="dateBean"/>
</bean>
  • dateBean 是一个通过工厂创建的日期对象的 Bean。
  • studentBean 是一个 Student 对象,拥有一个名为 birth 的属性,该属性引用了 dateBean

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

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

相关文章

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…

Python量化交易(二):金融市场的基础概念

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的Python量化交易学习总结文档&#xff1b;在现代社会中&#xff0c;投资已成为个人、机构和政府追求财富增长和资源配置的重要方式。…

sql-labs靶场第二十一关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

软件设计师:软件工程

文章目录 一、开发模型&#xff08;1&#xff09;瀑布模型&#xff08;需求明确&#xff09;&#xff08;2&#xff09;增量模型&#xff08;快速构建&#xff09;&#xff08;3&#xff09;演化模型&#xff08;迭代模型&#xff09;&#xff08;3.1&#xff09;原型模型&…

基于KV260的基础视频链路通路(MIPI+Demosaic+VDMA)

目录 1. 简介 1.1 要点 1.2 背景 1.2.1 Got stuck 1.2.2 Cant be Initialized 2. Overlay 2.1 参考 Overlay 2.1.1 KV260 Base 2.1.2 Pynq-CV-OV5640 2.2 自建 Overlay 2.2.1 IIC IP 2.2.2 MIPI CSI-2 Rx 2.2.3 AXI4-S Subset 2.2.4 Demosaic 2.2.5 Pixel Pack …

Pandas模块之垂直或水平交错条形图

目录 df.plot() 函数Pandas模块之垂直条形图Pandas模块之水平交错条形图 df.plot() 函数 df.plot() 是 Pandas 中的一个函数&#xff0c;用于绘制数据框中的数据。它是基于 Matplotlib 库构建的&#xff0c;可以轻松地创建各种类型的图表&#xff0c;包括折线图、柱状图、散点…

html----图片按钮,商品展示

源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图标</title><style>.box{width:…

中国建设银行广东省分行珠海市分行营业网点装修工程采购项目市场调研供应商征集公告

中国建设银行广东省分行珠海市分行营业网点装修工程采购项目市场调研 供应商征集公告 根据业务发展需要&#xff0c;中国建设银行广东省分行现对珠海市分行2025-2026年度网点装修工程采购项目进行供应商市场调研&#xff0c;有关事宜公告如下&#xff1a;

【案例演示】图像描述大模型示例及概念解释

【案例演示】图像描述大模型示例及概念解释 一、案例演示模型描述期望模型使用方式以及适用范围模型功能演示 二、大模型开源平台概览模型库的定义大模型开源平台 一、案例演示 模型链接&#xff1a;https://modelscope.cn/models/iic/mplug_image-captioning_coco_base_zh 模…

XML\XXE漏洞基本原理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理XXE漏洞的相应信息 XML与XXE漏洞 这个东西有许多叫法&#xff0c;XML漏洞与XXE漏洞差不多都是一个东西。 这个漏洞是出现在XMl上的&#xff0c;然后可以叫他XXE注入漏洞。 XML简介 XML是一种数据的传输…

WISE:重新思考大语言模型的终身模型编辑与知识记忆机制

论文地址&#xff1a;https://arxiv.org/abs/2405.14768https://arxiv.org/abs/2405.14768 1. 概述 随着世界知识的不断变化&#xff0c;大语言模型&#xff08;LLMs&#xff09;需要及时更新&#xff0c;纠正其生成的虚假信息或错误响应。这种持续的知识更新被称为终身模型编…

npm install 安装很慢怎么办?

安装源管理器nrm sudo npm install -g nrm #macOSnpm install -g nrm #Windows以管理员身份运行 安装完毕之后通过以下命令可以切换你想要的源 nrm ls #查看源列表* npm ---------- https://registry.npmjs.org/yarn --------- https://registry.yarnpkg.com/tencent ------…

FPGA第 13 篇,使用 Xilinx Vivado 创建项目,点亮 LED 灯,Vivado 的基本使用(点亮ZYNQ-7010开发板的LED灯)

前言 在FPGA设计中&#xff0c;Xilinx Vivado软件是一款功能强大的设计工具&#xff0c;它不仅支持硬件描述语言&#xff08;HDL&#xff09;的开发&#xff0c;还提供了丰富的图形化设计界面&#xff0c;方便用户进行硬件设计、调试和测试。这里我们将详细介绍&#xff0c;如…

操作系统Linux指令

1.注册表文件是Windows操作系统中的一种特殊文件&#xff0c;主要用于存储系统设置和用户配置信息。 这些文件通过REG文件扩展名进行标识&#xff0c;用户可以通过双击REG文件将其内容导入注册表中&#xff0c;从而对系统设置进行修改。 REG文件的特点是功能强大、灵活&#xf…

JAVA面试八股文(五)

#1024程序员节&#xff5c;征文# 在1024程序员节这个特别的日子里&#xff0c;首先&#xff0c;我想对每一位程序员表示最诚挚的祝贺&#xff01;祝愿大家在未来的日子里&#xff0c;能够继续热爱编程、追求卓越&#xff0c;携手共创更美好的科技未来&#xff01;让我们共同庆祝…

进程间通信(二)消息队列、共享内存、信号量

文章目录 进程间通信System V IPC概述System V IPC 对象的访问消息队列示例--使用消息队列实现进程间的通信 共享内存示例--使用共享内存实现父子进程间的通信&#xff08;进程同步&#xff09;示例--使用进程实现之前的ATM案例&#xff08;进程互斥&#xff09; 信号量示例--利…

Linux笔记---vim的使用

1. vim的基本概念 Vim是一款功能强大的文本编辑器&#xff0c;它起源于Unix系统的vi编辑器&#xff0c;并在其基础上进行了许多改进和增强。 Vim以其高效的键盘操作、高度的可定制性和强大的文本处理能力而闻名&#xff0c;尤其受程序员和系统管理员的欢迎。 Vim支持多种模式…

STM32之基本定时器TIM6和TIM7

1.定时器概念和作用 在编程任务中&#xff0c;定时器是非常常用的一个问题。当需要定时发送数据&#xff0c;定时起某个任务&#xff0c;定时做某个操作等等&#xff0c;这些都离不开定时器。本文基于以STM32F4xx系列开发板&#xff0c;介绍一下基本定时器。 2.基本定时器TIM…

基于Ubuntu24.04,下载并编译Android12系统源码 (二)

1. 前言 上篇文章&#xff0c;我们基于Ubuntu24.04&#xff0c;已经成功下载下来了Android12的源码&#xff0c;这篇文章我们会接着上文&#xff0c;基于Ubuntu24.04来编译Android源码。 2. 编译源码 2.1 了解源码编译的名词 Makefile &#xff1a; Android平台的一个编译系…

鸿蒙网络编程系列28-服务端证书锁定防范中间人攻击示例

1. TLS通讯中间人攻击及防范简介 TLS安全通讯的基础是基于对操作系统或者浏览器根证书的信任&#xff0c;如果CA证书签发机构被入侵&#xff0c;或者设备内置证书被篡改&#xff0c;都会导致TLS握手环节面临中间人攻击的风险。其实&#xff0c;这种风险被善意利用的情况还是很…