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

Spring之【详解FactoryBean】

目录

FactoryBean接口

通过FactoryBean创建Bean对象

如何获取FactoryBean中getObject方法创建的Bean

如何获取FactoryBean本身

源码分析

beanDefinitionMap

singletonObjects

factoryBeanObjectCache

FACTORY_BEAN_PREFIX

BeanFactory

BeanFactoryUtils#isFactoryDereference

看看Spring自己是怎么获取FactoryBean对象


FactoryBean接口

提供了三个方法

  • 方法一:返回由工厂管理的Bean实例对象

  • 方法二:返回Bean实例对象的类型

  • 方法三:Bean是否为单例,默认为单例

通过FactoryBean创建Bean对象

  • 定义一个普通的Java类
package spring.demo;public class Cat {
}
  • 定义一个组件实现FactoryBean接口
package spring.demo;import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;@Component
public class CatFactoryBean implements FactoryBean<Cat> {@Overridepublic Cat getObject() throws Exception {return new Cat();}@Overridepublic Class<?> getObjectType() {return Cat.class;}@Overridepublic boolean isSingleton() {return true;}
}

如何获取FactoryBean中getObject方法创建的Bean

通过beanName获取

package spring.demo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {// 容器启动AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);// 通过beanName获取Object bean = applicationContext.getBean("catFactoryBean");System.out.println(bean);}
}

如何获取FactoryBean本身

通过&+beanName获取

package spring.demo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {// 容器启动AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);// 通过&+beanName获取Object bean = applicationContext.getBean("&catFactoryBean");System.out.println(bean);}
}

源码分析

beanDefinitionMap

singletonObjects

factoryBeanObjectCache

FACTORY_BEAN_PREFIX

BeanFactory

BeanFactoryUtils#isFactoryDereference

看看Spring自己是怎么获取FactoryBean对象

http://www.xdnf.cn/news/1246771.html

相关文章:

  • C++ 网络编程入门:TCP 协议下的简易计算器项目
  • 数据结构04 栈和队列
  • 工业级 CAN 与以太网桥梁:串口服务器CAN通讯转换器深度解析(下)
  • Dot1x认证原理详解
  • ChatGPT以及ChatGPT强化学习步骤
  • 数据结构(三)双向链表
  • VSCode中使用Qt
  • 7、Redis队列Stream和单线程及多线程模型
  • Pandas query() 方法详解
  • SpringBoot3.x入门到精通系列:4.2 整合 Kafka 详解
  • 基于deepSeek的流式数据自动化规则清洗案例【数据治理领域AI带来的改变】
  • 2025-08-05Gitee + PicGo + Typora搭建免费图床
  • FPGA设计思想与验证方法学系列学习笔记003
  • springboot + maven 使用资源占位符实现动态加载配置文件
  • 【springcloud的配置文件不生效】
  • Linux 系统启动原理2
  • Occ3D: A Large-Scale 3D Occupancy Prediction Benchmark for Autonomous Driving
  • Unity开发者快速认识Unreal 的C++(四)Pawn和Actor
  • 智慧城市SaaS平台|市容环卫管理系统
  • Spring-rabbit使用实战六
  • Could not load the Qt platform plugin “xcb“ in “无法调试与显示Opencv
  • 类内部方法调用,自注入避免AOP失效
  • RK3568 Linux驱动学习——字符设备驱动开发
  • 森赛睿科技成为机器视觉产业联盟会员单位
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(六)
  • Vue.js 教程
  • css3属性总结和浏览器私有属性
  • Matplotlib(六)- 坐标轴定制
  • 【视觉识别】Ubuntu 22.04 上安装和配置 TigerVNC 鲁班猫V5
  • 技术与情感交织的一生 (十一)