Bean注入几种方式 (放入Spring容器)

news/2025/3/25 20:57:55/文章来源:https://www.cnblogs.com/jock766/p/18788425

目录


1、XML方式注入

  • set方式注入

  • 构造方法注入


2、注解方式注入

  • @Component + @ComponentScan

  • @Configuration + @Bean + @ComponentScan

  • @Import


3、实现ImportBeanDefinitionRegistrar接口


4、实现FactoryBean


5、实现BeanDefinitionRegistryPostProcessor


一、XML方式注入


在现在这个Springboot横行的年代,以XML来注入的方式可能已经不多见了,因为压根用不着,但毕竟是注入方式之一也得提一提,这种方式就是依赖于XML的解析来获取我们需要注入的Bean对象


常见的方式有:set方法注入、构造方法注入


这里举几个常见的例子:


1、set方式注入

测试:


2、构造方法注入

测试:


二、注解方式注入


1、@Component + @ComponentScan

我们开发中常用的 @Service 和 @Controller都是@Component下的注解,需要配合@ComponentScan注解才能被扫描到并放入IOC容器中


为什么平时却没用 @ComponentScan注解呢 ?

因为平时用的都是Springboot,Springboot启动类上的 @SpringbootApplication注解类下已经带有 @ComponentScan注解了,默认扫描启动类同级包下的 @Component


例子如下:

我们先准备一个获取IOC容器内bean 的工具类 SpringUtils:

测试要注入的Bean实体类:

可以看到报错了,压根找不到这个bean,因为我们上面说过了springboot默认扫描的是启动类同级下的路径,我们把启动类放到了独立的包下,所以扫描不到了,这时候我们要么在用@ComponentScan注解配置一次扫描路径,要么把启动类提出来,我这里演示前者


我们在启动类上加上@ComponentScan注解配置一次扫描路径,就可以看到注入成功啦


2、@Configuration + @Bean + @ComponentScan


@Configuration注解相信大家也都不陌生,这个注解同样要配合@ComponentScan使用,那到底和@Component有什么区别呢 ?


@Configuration注入的是CGlib代理类,@Component注入的是类本身


我们与@Component一样准备个@Configuration注入类:

可以看到Bean类的本质区别,难道为了这个就搞了@Configuration注解吗?当然不是,这个注解还可以配合@Bean注解一起使用,用来同时注入多个Bean

这样的@Bean可以在同一个类中注入多个,所以@Component更多的用来注入配置文件类,@Configuration 更多的用来注入多个实例类


3、@Import

这种方式一般用在第三方包的加载比较多,使用起来呢也简单需要注入哪个Bean,导入哪个Bean的class就可以了,例如:

这个注解使用得注意,一定要能被扫描到才行,可以直接放在启动类上,如果是普通需要配合@Component或者@Configuration来使用,因为此注解单独使用是不会被扫描到的,也就不会被加载了


在一个注解上导入多个Bean要写这么多可能不是很优雅,所以还可以配合ImportSelector接口使用:


4、实现 ImportBeanDefinitionRegistrar接口

看接口名称就知道了是不是有点像Bean的注册接口,需要配合@Import使用:

测试:

我们平时开发中常用的openfeign也是采用的这种方式:


5、实现FactoryBean


用这个得先搞清楚FactoryBean和BeanFactory的区别:

  • BeanFactory:IOC容器顶层接口,用来Bean容器管理

  • FactoryBean:是一个bean,是一个能产生bean的工厂,本身也会作为bean给容器管理,所以作为一个能产生Bean的工厂,我们可以自定义Bean(这也是最关键的点)


让我们来看看怎么用:

测试:

可以看到通过Class无论是工厂bean还是工厂生产的bean我们都可以获取,但是发现通过beanName获取bean的区别没有,我们通过工厂的beanName获取到的是实际生产的对象,

要获取真正的工厂需要在beanName前面加上&


为什么通过工厂的beanName获取到的是实际生产的对象 ?

其实从上述注入的过程中也能看到我们往容器中注入的其实是工厂Bean,并没有注入工厂生产的那个对象(可以打印容器所有的beanName验证),可以理解为在从容器中获取Bean的时候有判断是否实现了FactoryBean接口,实现了则会调用该bean的getObject()方法返回,所以此时会返回实际工厂生产的对象了

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

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

相关文章

自然资源数据要素支撑场景建设

自然资源数据要素与场景建设是推动经济社会高质量发展的重要途径。随着数字经济的快速发展,自然资源数据已成为关键的生产要素,其价值挖掘和利用成为推动经济社会发展的关键。自然资源数据要素的重要性自然资源数据要素包括地理、土地、矿产、海洋等多源数据,是支撑经济社会…

C语言分支与循环基础应用编程

实验任务1#include<stdio.h> #include<stdlib.h> #include<time.h> #define N 5int main() {int number;int i;srand(time(0));for(i=0;i<N;++i){number=rand()%100+1;printf("20490042%04d\n",number);}return 0; }问题1:生成一个1~100的随机…

NSSCTF Round#28 Team web题解

真是让人操心,但是又无法转移视线ez_ssrf 很简单的ssrf,知识点在网上搜都能搜到 payload http://node3.anna.nssctf.cn:28658@127.255.255.254/flag ez_php 第一部分有个非预期,直接/file就能出flag is_numeric绕过和md5强比较,很简单的知识点,这里就不细说了 第二部分网上…

Netty源码—4.客户端接入流程

大纲 1.关于Netty客户端连接接入问题整理 2.Reactor线程模型和服务端启动流程 3.Netty新连接接入的整体处理逻辑 4.新连接接入之检测新连接 5.新连接接入之创建NioSocketChannel 6.新连接接入之绑定NioEventLoop线程 7.新连接接入之注册Selector和注册读事件 8.注册Reactor线程…

【Esp32】为 idf 定制本地 Arduino 组件

在开始今天的水文前,老周先要奉劝一下国内某些嵌入式砖家和穴者,不要看不起 Arduino,它不是一种开发板,而是一种规范。Arduino 的思想是正确的,把各种开发板封装为统一的 API,让许多开源库共享相同的基础代码,严重降低了移植成本。Arduino 本质上使用的是 C/C++ 开发,只…

编译原理第五次作业

2.2.1 1)S-> S S *-> S S + S *->a S + S *->a a + S *->a a + a * 2)3)L={由多个a,加号,乘号组成的后缀表达式} 2.2.2 1)L={0^n 1^n | n>=1} 2)L={由多个a,加号,减号组成的前缀表达式} 3)L={ε或任意排列,嵌套的括号} 4)L={ε或包含相同数量a,b的字符…

XN2025 集训记录 D2

我好想你们啊 . 我怀念高一啊 . 至少还有理由放任自己开心不是吗 .XN2025 集训记录 D2 又是摆烂的一天 , 感觉打模拟赛时候的自己和改题时的自己完全不是一个人 . 不过往好了想 , 至少足够的模拟赛量 , 意味着我的高效率时间虽然不多 , 但是还有 . 买了个usb转网线 , 破费 39.9…

基于对偶二次曲线的快速椭圆检测

利用对偶二次曲线可精确求解椭圆圆心坐标。1、对偶二次曲线原理 二次曲线也称圆锥曲线,其几何定义是一个平面与两个顶点相对的圆锥相交所产生的交线。通常二次曲线指的是点二次曲线,它是定义在曲线点上的方程。而在射影几何中,齐次点和齐次线存在着可以互换的二元关系,因此…

【程设の旅】Python速通作业三

这节课老师讲了Python的面向对象部分 速度比较快 但是结合前面cpp的大部分知识可以弄懂 最后一道题估计是py特性了 可以理解但是那两个函数不知道是什么鬼 01:运算符的实现 描述 程序填空class A:def __init__(self,x):self.x = x // 在此处补充你的代码 a,b,c = map(int,input…

C/C++开发文档和常用的输入方式汇总

前几天复习的几种输入方式和帮助文档C/C++开发文档获取 之前下载过应该开发文档,今天push到了Gitee上了。可以随时获取,链接字符串操作 C 字符串 | 菜鸟教程 输入输出【包含字符串】 C 输入 & 输出 | 菜鸟教程 #include<stdio.h> int main() {char s[20];int i = 0…

Eino overview

一段话总结 Eino 是基于Golang的大模型应用开发框架,通过组件抽象(如ChatModel、Tool、Retriever)和图编排能力(Chain/Graph/Workflow)简化LLM应用开发。其核心优势包括类型安全的流处理、并发管理、切面注入以及开箱即用的最佳实践,支持构建复杂智能体(如ReAct)和多模…

llm 量化技术综述

综述: LLM 量化 1. Intro 低比特量化主要是减少tensor的bit-width,可以有效减少内存以及计算需求;主要可以压缩权重, 激活值, 和梯度,使得可以在受限资源的设备上使用。 2. 低比特LLM的基础 在这一届,我们主要引入从以下三个方面讨论:low-bit 数值格式 量化粒度 动态或者静…