怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂)

news2025/2/27 11:18:35

目录

      • BeanFactory
        • 怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂)
        • 总结

BeanFactory

怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂)

重点:Spring容器,例如Beanfactory其实并没有很多的功能,Spring之所以功能这么强大是因为一些后处理器

仅使用BeanFactory容器注入Bean对象

Config.class

@Configuration
static class Config {
  @Bean
  public Bean1 bean1() {
    return new Bean1();
  }

  @Bean
  public Bean2 bean2() {
    return new Bean2();
  }
}

Bean1

@Slf4j
static class Bean1 {
  public Bean1() {
    log.debug("构造 Bean1()");
  }
}

Bean2

@Slf4j
static class Bean2 {
  public Bean2() {
    log.debug("构造 Bean2()");
  }
}

主启动类测试

public class TestBeanFactory {
  public static void main(String[] args) {
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    // bean 的定义(即bean的一些描述信息,包含class:bean是哪个类,scope:单例还是多例,初始化、销毁方法等)
    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();
    beanFactory.registerBeanDefinition("config", beanDefinition);
    // 打印BeanFactory中Bean
    for (String name : beanFactory.getBeanDefinitionNames()) {
      System.out.println(name);
    }
    Config bean = beanFactory.getBean(Config.class);
    System.out.println("获取的bean对象为:"+bean);
  }

测试结果

在这里插入图片描述

存在的问题:

  • 从beanfactory工厂中打印的bean信息只有config ,并没有bean1bean2 的信息,说明@Bean 注解没有被处理

使用BeanFactory容器+bean工厂后处理器注入bean对象

给BeanFactory工厂添加常用处理器

// 给 BeanFactory添加一些常用的后处理器,让它具备解析@Configuration、@Bean等注解的能力
AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);

打印一下常用的后处理器

// BeanFactory 后处理器主要功能,补充了一些 bean 的定义
beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().forEach(beanFactoryPostProcessor -> {
  System.out.println(beanFactoryPostProcessor);
});

打印结果

在这里插入图片描述

从bean工厂中取出BeanFactory的后处理器,并且执行这些后处理器

// 从bean工厂中取出BeanFactory的后处理器,并且执行这些后处理器
// BeanFactory 后处理器主要功能,补充了一些 bean 的定义
beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().forEach(beanFactoryPostProcessor -> {
  System.out.println(beanFactoryPostProcessor);
  beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
});

测试结果

Config bean = beanFactory.getBean(Config.class);
System.out.println("获取的bean对象为:"+bean);
Bean1 bean1 = beanFactory.getBean(Bean1.class);
System.out.println("获取的bean对象为:"+bean1);
Bean2 bean2 = beanFactory.getBean(Bean2.class);
System.out.println("获取的bean对象为:"+bean2);

在这里插入图片描述

新增Inter接口及两个实现类Bean3、Bean4,修改Bean1

interface Inter {

}

@Slf4j
static class Bean3 implements Inter {
  public Bean3() {
    log.debug("构造 Bean3()");
  }
}

@Slf4j
static class Bean4 implements Inter {
  public Bean4() {
    log.debug("构造 Bean4()");
  }
}
@Slf4j
static class Bean1 {
  @Autowired
  private Inter inter;

  public Inter getInter() {
    return inter;
  }
  public Bean1() {
    log.debug("构造 Bean1()");
  }
}

问题一:

能够获取Bean1实例对象,但是调用它的getInter 方法获取不到inter 对象,为空

Inter inter = beanFactory.getBean(Config.class).bean1().getInter();
System.out.println("获取的bean对象为:"+inter);

在这里插入图片描述

解决方法:从BeanFactory中取出之前添加的后处理器并执行

// 要想@Autowired、@Resource等注解被解析,还要添加Bean的后处理器,可以针对Bean的生命周期的各个阶段提供扩展
// 从bean工厂中取出Bean的后处理器,并且执行这些后处理器
// BeanFactory 后处理器主要功能,补充了一些 bean 的定义
         beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);
beanFactory.addBeanPostProcessors(beanFactory.getBeansOfType(BeanPostProcessor.class).values());

问题二:

从BeanFactory取出@Autowired 注解对应的后处理器,执行后处理器,执行结果如下:

在这里插入图片描述

解决方案:使用@Autowired 注解注入Bean对象时,如果声明的是接口类型,那么声明的变量名要是对应的实现类名称

@Autowired
private Inter bean3;

public Inter getInter() {
  return bean3;
}
@Autowired
@Qualifier("bean3")
private Inter inter;

public Inter getInter() {
  return inter;
}
@Resource(name = "bean3")
private Inter inter;

public Inter getInter() {
  return inter;
}

上述三种方式均可以解决上述异常的问题。

总结

beanFactory 不会做的事

  • 不会主动调用BeanFactory的后处理器
  • 不会主动添加Bean的后处理器
  • 不会主动初始化单例(懒加载)
  • 不会解析BeanFactory,还不会解析 ${}, #{}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人生还需搏一搏,规划指南不可缺

前言 如题我的人生还需要再搏一搏,本篇文章,我将整理指定下个人目标计划,让这篇文章去指引自己去指导自己前进。敲下这一行字想起了高中时期的一段经历,在高一时我准备了一个小本子,按高一到高三每年每学期的期中&…

KeeperErrorCode = NoAuth for /hbase/tokenauth/keys

kerberos配置hbase出現問題 環境如下: 问题描述 想要在hadoop ha的場景上,基於kerberos配置hbase ha,出現了如下的bug org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode NoAuth for /hbase/runningat org.apache.…

C++ 第四弹动态内存管理

目录 1. C/C程序内存划分 2. C语言中内存管理的方式 3. new /delete 和 new[]/delete[] 4. void* operator new(size_t size) 和 void operator delete(void*) 可以重载的 5. 定义为new表达式 6. 常见的面试题 1. C/C程序内存划分 1. 栈 又叫堆栈 -- 非静态局部变量 / 函数…

PHP代码审计之环境配置

PHP代码审计之环境配置 前言一、PHP环境配置1.1 phpstudy和phpstorm下载配置1.2 Xdebug 配置1.3 phpstudy 基本使用1.4 phpstorm基本使用1.5 RIPR下载使用 二、代码审计配置文件2.5 PHP的核心配置(php.ini)1. safe_mode2. magic_quote_gpc3. magic_quote…

Maven学习1_将项目打包jar然后上传到GitHub、Nexus Sonatype仓库、搭建Sonatype私服

概述 主要学习记录Maven仓库相关知识,如何借助上传项目jar包到GitHub、Nexus Sonatype,,以及搭建自己的Nexus Sonatype私服,然后在Maven项目的pom文件引入使用,参考Maven官网文档:https://central.sonatype.org/publi…

【SQL应知应会】分析函数的点点滴滴(三)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数:…

HDFS写流程源码分析(一)-客户端

HDFS 写流程源码分析 一、客户端(一)文件创建及Pipeline构建阶段(二)数据写入(三)输出流关闭 二、服务端 环境为hadoop 3.1.3 一、客户端 以下代码创建并写入文件。 public void create() throws URISynt…

计网学习记录

ps:答案可能不正确噢。 1.什么是计算机网络体系结构?什么是网络协议?协议的三要素是什么?每个要素的含义是什么? 计算机网络体系结构: 我看书上也没说清啊。。。 (概念磨人啊) 什么是计算机的…

WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器(更新中)

文章目录 官方文档往期回顾零基础笔记项目实战(已完结) WPF项目创建为什么选net core版本 WPF 静态页面WPF 页面布局WPF样式 官方文档 往期回顾 零基础笔记 WPF 零基础入门笔记(0):WPF简介 项目实战(已…

github 代码实战pycharm

文章目录 下载代码配置环境进入环境下载数据集使用pycharm训练模型 下载代码 配置环境 conda env create -f environment.yml 进入环境 conda activate pytorch-CycleGAN-and-pix2pix 下载数据集 搜索download_pix2pix_dataset.sh然后用记事本打开,会发现有一个…

SpringBoot 疫苗接种管理系统 -计算机毕设 附源码83448

SpringBoot疫苗接种管理系统 摘 要 在目前的形势下,科技力量已成为我国的主要竞争力。而在科学技术领域,计算机的使用逐渐达到成熟,无论是从国家到企业再到家庭,计算机都发挥着其不可替代的作用,可以说计算机的可用领…

【软件架构】软件的设计图纸(用例图,类图,状态图,活动图,顺序图)

【软件架构】软件的设计图纸(用例图,类图,状态图,活动图,顺序图)_bdview的博客-CSDN博客 按图索骥---软件的设计图纸 序: 我一直以为,在软件设计中,各种图要比文档重要的多。图可以更加直接的…

RocketMQ 常见面试题(二)

broker如何处理拉取请求的? Broker处理拉取请求的具体流程如下: 客户端向Broker发送拉取请求,请求指定要拉取的主题名称和消费者组信息。 Broker首先会检查该消费者组是否已经存在,如果不存在则会创建该消费者组,并为…

Dubbox是什么,如何整合SpringBoot,有什么优势?

目录 一、Dubbox 是什么 二、Dubbox 如何整合SpringBoot 三、Dubbox 有什么优势 一、Dubbox 是什么 Dubbox是一款基于Java语言的分布式服务框架,是阿里巴巴公司开源的一款服务化治理框架,其前身为Dubbo。Dubbox是针对Dubbo进行了改进和升级&#xff…

akima 插值拟合算法 Python/C++/C版本

目录 前言Akima简介Akima优势 算法的代码实现python版C 版代码解析1代码解析2代码解析3 C版 实验对比 前言 鉴于“长沙等你”网站上Akima算法文章大部分要VIP观看或者下载,即使是付费也有质量不佳,浪费Money也浪费时间。 笔者根据查到的资料分享给大家。…

第5章 链路层

1、局域网的协议结构一般不包括( ) A. 数据链路层B. 网络层C. 物理层D. 介质访问控制层 逻辑链路控制子层、介质访问控制子层、物理层 2、下列关于二维奇偶校验的说法,正确的是( ) A. 可以检测和纠正双比特差错B…

NodeJS 了解和快速入门 - 实现 http 服务 操作 mysql

目录 1. 介绍 NodeJS 2. NodeJS 快速入门 3. NodeJS 实现 Httpserver 服务 4. NodeJS 操作 MySQL 数据库 1. 介绍 NodeJS 1. Node 是一个让 JavaScript 运行在服务端的开发平台, 它让 JavaScript成为与 PHP, Python, Perl, Ruby 等服务端语言平起平坐的脚本语言, 发布于 200…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

VUE L 表单数据过滤器 ⑨

目录 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨ V u e j s Vuejs Vuejs收集表单数据过滤器 使用 C o o k i e Cookie Cookie 影响总结 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹…

如何将Springboot项目升级成Springcloud项目

本文以nacos为例 分为以下几个步骤 1. 下载nacos软件 2. pom文件配置 3. application.yml文件配置 4. 代码调用 5. 效果展示 一 . 下载nacos软件 1.1 下载nacos-server-2.2.0-BETA这个版本 1.2 修改nacos配置文件 打开bin目录下的startup.cmd,将第26行的 set MO…