更简单的存取Bean方式-@Bean方法注解
1.@Bean方法存储
类注解是添加在某个类上的,那么方法注解是添加在某个方法前的
public class UserBeans {@Beanpublic User user1(){User user = new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");return user;}}
当我们使用测试类去获取Bean时,发现获取不到
图一
无法正确拿到Bean的原因:
原因一:@Bean命名规则和不打雷注解的命名规则不同,@Bean存储的对象的命名默认是方法的名称
此时改动对象名称为user1(方法名),发现还是会报错
原因二:方法注解是要配合五大类注解使用
注意:无法获取到对象的原因有两个,名称必须是方法名且方法注解需要配合五大类注解
名称不能换成类名, 对象名等,加上五大类注解也不能成功获取到!!
这是spring的规定,这么做也是为了整体性能的提升,只扫描加了五大类注解的类下是否有@Bean方法注解,没有五大类注解,就不扫描该类是否有方法注解
我们看一些其他场景,一般方法名都是带动词的,get,set等等,但是对象名称是一个名词,所以直接将方法名称写进去是不太合适的.Bean名称是可以改动的,给注解设置参数即可
通过观察Bean源码发现@Bean(name = " ")和@Bean(value = " ")都可以进行设置Bean名称
还可以设置多个名称
@Bean(name = {"user","u1"})
那么设置了重命名之后,还能使用原方法名获取对象的方式还能使用吗?
答案是不能的,重命名之后默认方法名获取的方式就不能获取到Bean了
如果同一个类中有多个方法返回user呢,是否能拿到重命名后的bean?
package com.java.demo.component;import com.java.demo.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class UserBeans {@Bean(name = {"user","u1"})public User user1(){User user = new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");return user;}@Beanpublic User user2(){User user = new User();user.setUid(002);user.setUname("Lisi");user.setAge(29);user.setPassword("321123");return user;}}
是可以的,spring是允许将同一个类型的多个对象存储到容器中的
如果两个类中有相同的方法名,返回相同的user时,会出现什么情况呢?
执行多次,结果都是相同的,是因为类似于hashmap中的覆盖,zhangsan先注入,wangwu后注入,加载出来的对象就是wangwu
可使用@Order控制诸如顺序,值越小,优先级越高,越先注入,被覆盖的可能就会增大
让wangwu先注入.lisi后注入,再获取username
此时获取的是lisi这个bean
注入的方法是不能带有参数的,因为容器加载启动的时候,就会将Bean存储到容器中,而你是没有办法给传参的
2.获取Bean对象
获取Bean对象也叫做对象装配,是把对象取出来放到某个类中,也叫对象装配
实现方法有三种:
1.属性注入(Field Injection)
是日常开发使用最多的注入方式
优点是使用简单,只需要给变量添加一个注解(@Autowired)就可以在不new对象的情况下,直接获得注入的对象
注意:在静态方法中不能使用这个注解,因为静态模块是在spring加载之前就加载了的,根本获取不到
我们在controller中获取service的Bean 并使用
获取成功
缺点:
1.无法注入不可变对象
2.只适用于IoC容器,兼容性不好
3.可能违反单一设计原则
2.setter注入(Setter Injection)
优点:符合单一设计原则,每次传输的都是单个变量
缺点:
1.不能注入不可变对象
2.使用setter注入的对象可能被修改,普通的set方法支持可能被调用多次,每次可以传输不同的对象
3.构造方法注入(Spring官方推荐的注入方式)
private final UserService service;@Autowiredpublic UserController(UserService service) {this.service = service;}public void sayHi(){System.out.println("com.java.demo --do userController sayHi()");service.sayHi();}

注意:如果当只有一个构造方法时,spring允许不加@Autowired注解!前两种方式不能进行省略,会报异常!
优点:
1.能注入不可变对象(使用final修饰的对象)
为啥属性注入,setter注入不可以呢?被final修饰的对象必须满足二者之一的条件,要么直接创建时进行赋值,要么在构造器中赋值!
2.注入的对象不会被改变,构造方法只能执行一次
3.保障注入对象完全被初始化
4.兼容性更好
还有另一个注解关键字@Resource
@Resource与@Autowired的区别
1.@Resource来自jdk,@Autowired来自Spring
2.使用时设置的参数不同,@Resource可以支持更多的参数设置
@Autowired则没有,当同一个类型的类被注入多个到spring,就需要设置一些内部属性
下文有示例,使用@Resource设置参数
3.@Resource不能用于构造方法注入

区别4:
在spring容器中找Bean,有两种方式 1.根据类型查找 2.根据名称查找
@Component
@Order(20)
public class UserBeans2 {@Bean(name = {"user1","u1"})public User user1(){User user = new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");return user;}@Beanpublic User user2(){User user = new User();user.setUid(002);user.setUname("wangwu");user.setAge(29);user.setPassword("321123");return user;}}@Component
@Order(30)
public class UserBeans {@Beanpublic User user3(){User user = new User();user.setUid(002);user.setUname("Lisi");user.setAge(29);user.setPassword("321123");return user;}}

@Autowired先根据类型查找,如果类型比较多,再根据名称查找,如果还没找到唯一的Bean,就报错
Caused by: org.springframework.beans.factory.
NoUniqueBeanDefinitionException:
No qualifying bean of type 'com.java.demo.entity.User' available:
expected single matching bean but found 2: user1,user2,user3
这里由于注入了相同类型的Bean(User),所以@Autowired还要根据名称查找,但是名称有三个,不能唯一确定,就报错了
将Controller2中的名称修改后,就能找到唯一确定的Bean

user1对应的name是zhangsan
成功找到

如果改动名字影响很大,不能改变.@Resource也解决不了,它是先根据名称查,再根据类型查找
这就是@Resource和@Autowired的第四个区别
不想改变名称,但是我们@Resource可以设置参数!!!
使用@Resource设置一个新的名称

成功拿到

@Autowired是设置不了的!

如果不使用@Reousrce.可使用@Autowired和@Qualifier同时完成获取Bean
成功获取到了

关于更加简单的存取Bean内容就结束了
相关文章:
更简单的存取Bean方式-@Bean方法注解
1.Bean方法存储 类注解是添加在某个类上的,那么方法注解是添加在某个方法前的 public class UserBeans {Beanpublic User user1(){User user new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");retur…...
边缘计算与AI布署应用电力物联网解决方案-RK3588开发平台
电力行业拥有规模庞大的各类设备,如电表、各类保护、采集、控制设备。面对分布式发电、储能、用户微网等一系列综合问题,边缘计算与AI布署可满足“端侧本地化”高效运用的需求,协助提升最后一公里运行效率。 瑞芯微RK3588J、内置独立NPU&…...
centos部署unity accelerator
参考 https://docs.unity3d.com/Manual/UnityAccelerator.html 方案1:下载Unity Accelerator 手动安装, unity-accelerator-app-v1.0.941g6b39b61.AppImage为下载的文件 1、放入服务器目录, chmod x unity-accelerator-app-v1.0.941g6b39b61.AppImage 2…...
HANA开发指南
建模方面 1、建模方式:图像化建模、SQL建模、CE语言建模 2、维护:SQL和CE比图形化建模更容易维护和修改 3、性能:图形化和CE会经过系统优化,性能一般优于SQL语言 4、可按需要设置参数、变量、Hierachy、聚合类型等 5、在S4系…...
请问你见过吐代码的泡泡吗(冒泡排序)
🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《算法详解》,笔者用重金(时间和精力)打造,将算法知识一网打尽,希望可以…...
【VM服务管家】VM4.0平台SDK_2.1环境配置类
目录 2.1.1 环境配置:CSharp二次开发环境配置方法2.1.2 环境配置:Qt二次开发环境配置方法2.1.3 环境配置:MFC二次开发环境配置方法2.1.4 环境配置:VB.Net二次开发环境配置方法2.1.5 环境配置:运行出现Vm.Core.Solution…...
最新研究:可审计的具有拜占庭鲁棒的联邦学习方案
Y. Liang, Y. Li and B. -S. Shin, “Auditable Federated Learning With Byzantine Robustness,” in IEEE Transactions on Computational Social Systems, doi: 10.1109/TCSS.2023.3266019. 可免费下载:https://download.csdn.net/download/liangyihuai/87727720…...
JDK1.8下载、安装和环境配置教程
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🦾🦾 目录 window系统安装java 下载JDK 配置环境变量 …...
天津超算,青索帮助文档
连接 第一步,点击 配置VPN(切换到局域网用)和机器(也就是各套超算系统)。 第二步,点击 机器 选择对应的机器。通常会在下方显示可用的机器,单击其中一个即可。如果只有一个机器,…...
SpringMVC的拦截器和异常处理器
目录 lerInterceptor 拦截器 1、拦截器的作用 2、拦截器的创建 3、拦截器的三个抽象方法 4、拦截器的配置 5、多个拦截器的执行顺序 SpringMVC的异常处理器 1、异常处理器概述 2、基于配置文件的异常处理 3、基于注解的异常处理 lerInterceptor 拦截器 1、拦截器的作…...
查看库文件是32位还是64位|查看lib是静态库还是导入库|判断是debug模式还是release模式
文章目录 dll位数查看lib位数查看查看lib库是静态库还是导入库dll库文件信息查看lib库文件内容查看dll库查看编译模式是debug还是release方法一方法二方法三 lib静态库查看编译模式是debug还是release方法一方法二 lib导入库查看编译模式是debug还是release查看Linux下的.a库&a…...
Python小姿势 - Python爬取数据的库——Scrapy
Python爬取数据的库——Scrapy 一、爬虫的基本原理 爬虫的基本原理就是模拟人的行为,使用指定的工具和方法访问网站,然后把网站上的内容抓取到本地来。 爬虫的基本步骤: 1、获取URL地址: 2、发送请求获取网页源码; 3、…...
[C++初阶]栈和队列_优先级队列的模拟实现 deque类 的理解
为了更好的理解优先级队列priority_queue,这里会同时进行栈和队列的提及 文章目录 简要概念(栈和队列)栈和队列的模拟实现与使用stack(栈)deque的理解和操作queue priority_queue(优先级队列)框…...
Spring是什么?关于Spring家族
初识Spring 什么是Spring? Spring是一个开源的Java企业级应用程序开发框架,由Rod Johnson于2003年创建,并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型,支持开发各种类型的应用程序&#x…...
自然语言处理数据集集锦(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 最近更新时间:2023.4.26 最早更新时间:2023.4.25 文本摘要主题的数据集见我之前写的另一篇博文:文本摘要数据集的整理、总结及介绍(持续更新ing…) 智能司法主题的数据集我准备等项目…...
93、Dehazing-NeRF: Neural Radiance Fields from Hazy Images
简介 论文:https://arxiv.org/pdf/2304.11448.pdf 从模糊图像输入中恢复清晰NeRF 使用大气散射模型模拟有雾图像的物理成像过程,联合学习大气散射模型和干净的NeRF模型,用于图像去雾和新视图合成 通过将NeRF 3D场景的深度估计与大气散射模…...
JAVA子类与继承
目录 JAVA子类与继承 一、子类与父类: 二、子类与对象 三、成员变量的隐藏和方法重写 四、super关键字(P122) 五、final关键字 六、对象的上转型对象(P126) 七、继承与多态(P128) 八、abstract类和…...
62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库
文章目录 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库62.1 创建数据库示例 62.2 查看数据库示例 62.3 选择数据库示例 62.4 删除数据库示例 62.5 备份数据库示例 62.6 恢复数据库示例 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库 62.1 创建数据库…...
【分布式搜索引擎ES01】
分布式搜索引擎ES 分布式搜索引擎ES1.elasticsearch概念1.1.ES起源1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引 1.3.es的一些概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch 1.4.1安装es、kibana、IK分词器1.4.2扩展词词典与停用词词典 2.索引库操作2.1.mappi…...
1.3 鞅、停时和域流-鞅(布朗运动与随机计算【习题解答】)
Let X = ( x n , F n ) , n = 1 , ⋯ , N X=\left(x_n, \mathcal{F}_n\right), n=1, \cdots, N X...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
