spring学习(spring-bean实例化(实现FactoryBean规范)(延迟实例化bean))

目录

一、spring容器实例化bean的几种方式。

(1)无参构造与有参构造方法。

(2)静态工厂与实例工厂。

(3)实现FactoryBean规范。

二、spring容器使用实现FactoryBean规范方式实现bean实例化。

(1)基本介绍。

(2)实现FactoryBean规范完成bean实例化的基本步骤。

1、测试项目准备工作。

2、指定工厂类中实现FactoryBean接口。

<1>方法getObject()。

<2>方法getObjectType()。

<3>方法isSingleton()。

3、spring配置文件中配置bean。(交给spring容器管理)

4、测试类。(MainApp)

(3)debug模式查看FactoryBean规范方式是延迟实例化bean。

1、设置断点。执行debug模式。

2、推进程序的执行,查看重要变量的赋值。

<1>属性beanFactory、beanDefinitionMap。

<2>属性singletonObjects。

<3>spring缓存机制。属性factoryBeanObjectCache。


  • 本篇博客接着上篇《spring容器使用实例工厂实例化bean》继续学习。

一、spring容器实例化bean的几种方式。

(1)无参构造与有参构造方法。
  • 使用构造方法实例化bean。spring学习(spring-bean实例化(无参构造与有参构造方法实现)详解)-CSDN博客

(2)静态工厂与实例工厂。
  • 使用静态工厂方式实例化bean。spring学习(spring-bean实例化(静态工厂))-CSDN博客
  • 使用实例工厂方式实例化bean。spring学习(spring-bean实例化(实例工厂))-CSDN博客

(3)实现FactoryBean规范。
  • 最后一种实例化bean的方式:实现FactoryBean规范。(在本篇博客进行学习)

二、spring容器使用实现FactoryBean规范方式实现bean实例化。

  • 实现FactoryBean规范涉及实现接口FactoryBean<泛型>
(1)基本介绍。
  • 在spring框架中,FactoryBean是一种特殊的bean,允许我们进行自定义实例化bean的过程
  • 通过实现FactoryBean<?>接口,可以控制spring容器完成创建和初始化bean。

(2)实现FactoryBean规范完成bean实例化的基本步骤。
1、测试项目准备工作。
  • 本篇博客通过简单demo工程进行代码演示。
  • 整体的项目结构。分为工厂包(factory)、业务层包(service)、测试包(test)。
  • 目的:类"UserServiceFactoryBean"实现FactoryBean规范并为类"UserServiceImpl"实例化bean。


2、指定工厂类中实现FactoryBean<?>接口。
  • 注:"<?>"表示需提供的泛型。(表示需要实例化bean的类型)
  • 具体核心操作是实现该接口的两个方法。另外一个方法一般不实现。下面具体介绍!

<1>方法getObject()。
  • 代替实例工厂提供的实例方法或者静态工厂提供的静态方法。
  • 作用:返回<?>泛型指定类型的实例化bean

<2>方法getObjectType()。
  • 作用:返回创建的实例的类型(返回对应的字节码对象:xxx.class)

<3>方法isSingleton()。
  • 方法isSingleton()。作用:设置spring容器实例化的bean是单例还是非单例对象

  • 它是FactoryBean接口中的default方法。不强制要求实现类去实现。
  • 在Java中default类型的方法是一种特殊的方法,它允许接口中包含具体的实现代码,这样实现该接口的类可以继承这些方法的实现,但也可以覆盖它们以提供自己的实现。

  • 类"UserServiceFactoryBean"(实现FactoryBean的工厂)。

package com.fs.factory;

import com.fs.service.UserService;
import com.fs.service.impl.UserServiceImpl;
import org.springframework.beans.factory.FactoryBean;

//实现FactoryBean的UserService工厂
public class UserServiceFactoryBean implements FactoryBean<UserServiceImpl> {

    //代替原始实例工厂创建对象的实例方法
    @Override
    public UserServiceImpl getObject() throws Exception {
        System.out.println("UserServiceFactoryBean已工作......");
        //return——UserServiceImpl对象
        return new UserServiceImpl();
    }

    //返回创建的实例的类型(返回对应类型的字节码.class)
    @Override
    public Class<?> getObjectType() {
        return UserService.class;
    }

    //设置实例化的bean是否单例
    @Override
    public boolean isSingleton() {
        return true;
        //若不想返回单例的bean就return false
        //return false;
    }
}
3、spring配置文件中配置bean。(交给spring容器管理)
  • 不像静态工厂或者实例工厂实例化bean时,需要在<bean>标签上使用属性"factory_bean"或"factory_method"指定工厂或者指定方法(静态/实例)。

  • 实现FactoryBean规范在spring配置文件的操作比较简单。
  • 只需要将实现FactoryBean<?>接口的类完成<bean>标签的基础配置即可(id与class)。
<?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">
    <!--实现FactoryBean规范实例化bean-->
    <!--配置UserServiceFactoryBean——生产UserServiceImpl类的bean-->
    <bean id="userServiceFactoryBean" class="com.fs.factory.UserServiceFactoryBean"></bean>
</beans>
4、测试类。(MainApp)
  • 使用ApplicationContext容器加载配置文件,并通过容器对象getBean()指定实现FactoryBean接口的工厂类的id获取对应实例化(UserServiceImpl类)的bean。
package com.fs.test;

import com.fs.service.impl.UserServiceImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        //使用IoC容器(ApplicationContext)获取spring容器管理的bean对象
        //1.创建容器对象。实例化时参数指定对应的配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springBean.xml");
        //2.通过<bean>标签的唯一标识id获取对应在spring容器已经配置的bean对象(生产UserServiceImpl类的bean)
        Object obj = context.getBean("userServiceFactoryBean");
        //3.强制类型转换
        UserServiceImpl userService = (UserServiceImpl) obj;
        //4.调用UserService中的save方法
        userService.save();
    }
}
  • 程序测试运行结果。


(3)debug模式查看FactoryBean规范方式是延迟实例化bean。
1、设置断点。执行debug模式。
  • 在测试类中设置合适的断点。查看程序运行的整个过程。


2、推进程序的执行,查看重要变量的赋值。
  • 刚进入main()方法。


  • 执行第1步。
<1>属性beanFactory、beanDefinitionMap。


<2>属性singletonObjects。
  • 发现"userServiceFactoryBean"与存储在beanDefinitionMap中的地址不一样。
  • 因为底层spring实例化bean时,解析完<bean>标签后存储在beanDefinitionMap里面的bean再以键名的方式遍历存储到singletonObjects中。
  • 此时还是没有发现工厂帮我们返回的"UserServiceImpl"的bean。(延迟实例化bean



<3>spring缓存机制。属性factoryBeanObjectCache。
  • 此时还在第一步。
  • 当getBean()方法未执行。说明ApplicationContext容器创建后,我们需要的实例化bean(UserServiceImpl)还未及时创建(延时实例bean)。


  • 继续下一步。执行getBean()方法后。


  • 此时缓存变量"factoryBeanObjectCache"已经有对应已经实例好的bean了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】mac安装Java17(JDK17)

文章目录 下载java17一、安装二、环境变量 下载java17 官网下载&#xff1a;https://www.oracle.com/java/technologies/downloads 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、安装 直接安装后&#xff0c;安装完后目录会存放在下面目录下 /…

mysql免安装版配置教程

一、将压缩包解压至你想要放置的文件夹中&#xff0c;注意&#xff1a;绝对路径中要避免出现中文 二、在解压目录下新建my.ini文件&#xff0c;已经有的就直接覆盖 my.ini文件内容 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\\tools\\mysql-8.1.0-win…

web:pc端企业微信登录-vue版

官方文档&#xff1a;developer.work.weixin.qq.com/document/pa… 不需要调用ww.register&#xff0c;直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…

基于Spring Boot的无可购物网站系统

一、系统背景与意义 随着互联网的快速发展&#xff0c;电子商务已经成为人们日常生活的重要组成部分。构建一个稳定、高效、可扩展的电商平台后端系统&#xff0c;对于满足用户需求、提升用户体验、推动业务发展具有重要意义。Spring Boot作为当前流行的Java开发框架&#xff…

YOLOv11改进,YOLOv11添加DLKA-Attention可变形大核注意力,WACV2024 ,二次创新C3k2结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…

fpga系列 HDL:Quartus II PLL (Phase-Locked Loop) IP核 (Quartus II 18.0)

在 Quartus II 中使用 PLL (Phase-Locked Loop) 模块来将输入时钟分频或倍频&#xff0c;并生成多个相位偏移或频率不同的时钟信号&#xff1a; 1. 生成 PLL 模块 在 Quartus II 中&#xff1a; 打开 IP Components。 file:///C:/intelFPGA_lite/18.0/quartus/common/help/w…

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法&#xff0c;如网格和点云&#xff0c;适合GPU加速的光栅化操作&#xff0c;但缺乏灵活性。而基于神经辐射场&#xff08;NeRF&#xff09;的表示方式&#xff0c;尽管质量高&#xff0c;但需要高成本的训练和渲染时间。此外&#xff0…

Unity性能优化---使用SpriteAtlas创建图集进行批次优化

在日常游戏开发中&#xff0c;UI是不可缺少的模块&#xff0c;而在UI中又使用着大量的图片&#xff0c;特别是2D游戏还有很多精灵图片存在&#xff0c;如果不加以处理&#xff0c;会导致很高的Batches&#xff0c;影响性能。 比如如下的例子&#xff1a; Batches是9&#xff0…

计算机网络知识点全梳理(三.TCP知识点总结)

目录 TCP基本概念 为什么需要TCP 什么是TCP 什么是TCP链接 如何唯一确定一个 TCP 连接 TCP三次握手 握手流程 为什么是三次握手&#xff0c;而不是两次、四次 为什么客户端和服务端的初始序列号 ISN 不同 既然 IP 层会分片&#xff0c;为什么 TCP 层还需要 MSS TCP四…

找出1000以内的所有回文数

找出1000以内的所有回文数 方法概述检查回文数的方法伪代码C代码实现代码解析运行结果在计算机科学中,回文数是一种具有对称性质的数,即从左向右读和从右向左读都是相同的。例如,121、1331、12321都是回文数。本文将利用数据结构、C语言和算法的知识来编写一个程序,找出100…

Go-FastDFS文件服务器一镜到底使用Docker安装

本文章介绍一镜到底安装go-fastdfs并配置数据文件到linux 由于国内镜像无法安装go-fastdfs&#xff1a;国内环境已经把docker官方的网站给封闭了 我们需要从国外的一台服务器&#xff0c;下载images镜像&#xff0c;然后进行转发加载到国内服务器 当然我也给你们准备了docke…

ArcGIS计算土地转移矩阵

在计算土地转移矩阵时&#xff0c;最常使用的方法就是在ArcGIS中将土地利用栅格数据转为矢量&#xff0c;然后采用叠加分析计算&#xff0c;但这种方法计算效率低。还有一种方法是采用ArcGIS中的栅格计算器&#xff0c;将一个年份的地类编号乘以个100或是1000再加上另一个年份的…

软路由系统 --- VMware安装与配置OpenWRT

目录: OpenWrt安装与配置 一、下载OpenWRT映像二、img转换vmdk格式三、创建虚拟机&#xff08;OpenWRT&#xff09;四、启动系统&#xff08;OpenWRT&#xff09;五、配置网络信息&#xff08;LAN、WAN&#xff09;六、登录OpenWRT后台管理界面 一、下载OpenWRT映像 OpenWrt映…

利用notepad++删除特定关键字所在的行

1、按组合键Ctrl H&#xff0c;查找模式选择 ‘正则表达式’&#xff0c;不选 ‘.匹配新行’ 2、查找目标输入 &#xff1a; ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为&#xff1a;&#xff08;空&#xff09; 配置界面参考下图&#xff1a; ​​…

Moretl开箱即用日志采集

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

Java中的全局异常捕获与处理

引言 Java编程中&#xff0c;异常情况是不可避免的&#xff0c;优秀的异常处理机制是保证程序稳定性和可靠性的重要因素&#xff0c;当程序出现异常的时候&#xff0c;如果没有进行适当的处理&#xff0c;可能导致程序崩溃&#xff0c;丢失数据等严重问题。全局异常捕获与处理可…

基于Spring Boot的小区车辆管理系统

一、系统背景与目的 随着城市化进程的加快&#xff0c;小区内的车辆数量急剧增加&#xff0c;车辆管理问题日益凸显。传统的车辆管理方式存在效率低、易出错、信息不透明等问题。为了解决这些问题&#xff0c;基于Spring Boot的小区车辆管理系统应运而生。该系统旨在通过信息化…

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎&#xff0c;随着智能驾驶时代的到来&#xff0c;应用也会越来越广泛&#xff0c;关于mapbox-gl和其他地理引擎的详细对比&#xff08;比如CesiumJS&#xff09;&#xff0c;后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…

【计算机网络课程设计】校园网规划与设计

摘要 在科学技术飞速发展的时代&#xff0c;网络互联技术显示出了它蓬勃发展的生命力&#xff0c;它逐渐进入了人们的家居生活&#xff0c;使得当今社会的智能化和网络化越来越来明显。由于Internet的信息和服务内容不断的扩大&#xff0c;使得用户对网络的需求急剧增加。家庭…