更简单的存取Bean方式-@Bean方法注解

news/2024/4/26 22:29:55/文章来源:https://blog.csdn.net/chenchenchencl/article/details/130184102

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();}

4d05cfc2d9b04180a5cbc9246b460e05.png

注意:如果当只有一个构造方法时,spring允许不加@Autowired注解!前两种方式不能进行省略,会报异常! 

优点:

1.能注入不可变对象(使用final修饰的对象)

f5a54063347449e9993371238f0e8306.png 为啥属性注入,setter注入不可以呢?被final修饰的对象必须满足二者之一的条件,要么直接创建时进行赋值,要么在构造器中赋值!

2.注入的对象不会被改变,构造方法只能执行一次

3.保障注入对象完全被初始化

4.兼容性更好

还有另一个注解关键字@Resource

@Resource与@Autowired的区别

1.@Resource来自jdk,@Autowired来自Spring

2.使用时设置的参数不同,@Resource可以支持更多的参数设置

819078185c7f4e5e8e4e402366364c4a.png 

@Autowired则没有,当同一个类型的类被注入多个到spring,就需要设置一些内部属性

下文有示例,使用@Resource设置参数

3.@Resource不能用于构造方法注入

17734476ef9a428a8131a0d3460923bd.png

区别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;}}

f2cd1e683ed04c12b11d00b6b7ef1093.png 

23261bf864754a09b4208022d249c6ce.png

@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

0c041d774f80485e94c5af659db056a3.png

user1对应的name是zhangsan 

成功找到

ee57dff700744c82bd058f08149bd70b.png

如果改动名字影响很大,不能改变.@Resource也解决不了,它是先根据名称查,再根据类型查找

这就是@Resource和@Autowired的第四个区别


不想改变名称,但是我们@Resource可以设置参数!!!

使用@Resource设置一个新的名称

cd251f0d44df4f31b8ed1fecf9e6b2fe.png

成功拿到

5ec17782af6f4db8823b9e57a5faf39e.png

@Autowired是设置不了的!

f45b66f8d7a445339debdcf57cac5a09.png

如果不使用@Reousrce.可使用@Autowired和@Qualifier同时完成获取Bean0a3b9c20bb9e482ba4de1daf91e92f93.png

成功获取到了

ecd297518d294e9dbbc9f3d1b65b6edb.png

关于更加简单的存取Bean内容就结束了

 

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

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

相关文章

【分布式搜索引擎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…

Springcloud连接nacos集群,nacos地址配置为nginx,报错:requst nacos server failed

先说下版本: Spring cloud: Hoxton.SR12 spring.cloud.alibaba: 2.2.9.RELEASE spring.boot: 2.3.12.RELEASE Linux Centos7 nacos-server:2.1.0 nginx: 1.20.2 环境说明: nacos正常搭建三个集…

supervisor安装

说明 Supervisor翻译过来是监管人,在Linux中Supervisor是一个进程管理工具,当进程中断的时候Supervisor能自动重新启动它。可以运行在各种类Linux/unix的机器上,supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通…

【虚幻引擎】UE4/UE5科大讯飞文字合成语音

一、链接地址 链接:https://pan.baidu.com/s/15Qoc48x3DLpw4eW1qHXInQ 提取码:jqpx B站视频链接:https://space.bilibili.com/449549424?spm_id_from333.1007.0.0 二、案例介绍 第一步:首先进入讯飞开放平台注册一个账号&…

ThreadPoolExecutor源码阅读流程图

1.创建线程池 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), def…

Automa函数学习(三)

从变量中获取数据 当我们想要用automa获取文本标签获取到网页的文本内容后,想要将获取到的文本内容当做参数往后面的标签里进行传递时就需要用到automa提供的传参格式 {{ variables.自定义参数名}} 举例: 先建立打开百度首页工作流 前面自定义的变量名为text,所以这里参数拼接…

开放式耳机有什么好处,盘点几款性能不错的开放式耳机

随着人们对生活质量要求的提高&#xff0c;大家在运动的时候都喜欢戴上耳机&#xff0c;享受运动的乐趣。但是传统耳机戴久了之后就会出现耳朵酸痛的情况&#xff0c;这是因为传统耳机佩戴方式是通过空气振动来传递声音&#xff0c;而人在运动时就会伴随着大量的汗水&#xff0…

深入学习RabbitMQ五种模式(一)

1.安装erlang 下载otp_win64_25.3.exe https://www.erlang.org/downloads erlang安装完成&#xff0c;需要配置erlang环境变量 ERLANG_HOMEE:\software\Erlang OTPPATH%PATH%;%ERLANG_HOME%\bin; 2.安装RabbitMQ 下载rabbitmq-server-3.11.13.exe https://www.rabbitmq.com/dow…

【Python 协程详解】

0.前言 前面讲了线程和进程&#xff0c;其实python还有一个特殊的线程就是协程。 协程不是计算机提供的&#xff0c;计算机只提供&#xff1a;进程、线程。协程是人工创造的一种用户态切换的微进程&#xff0c;使用一个线程去来回切换多个进程。 为什么需要协程&#xff1f; …

IntelliJ IDEA 接入ChatGPT (免费,无需注册)生产力被干爆了!

IntelliJ IDEA 接入ChatGPT 前言 : 今天给大家介绍一款好用的 IntelliJ IDEA ChatGPT 插件 可以帮助我们写代码&#xff0c;以及语言上的处理工作&#xff0c;以及解释代码。让我们的生产力大大提高&#xff01; 一. ChatGPT-Plus 功能介绍 支持最新idea版本AI询问功能,写好…

Adobe Photoshop 软件下载

Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。 时至今日&#xff0c;Adobe Photoshop 已经成为当今世界上最流行、应用最广泛的图像处理软件。不但设计专业的学生要系统的学习这个…

智能建筑中电力监控系统的应用与产品选型

摘要&#xff1a;近几十年&#xff0c;中国现代化经济不断发展&#xff0c;计算机技术、信息技术等相关产业也取得了飞跃性的进步。随着商业、生活以及公共建筑不断提高智能管理和节能的要求&#xff0c;电力监控系统开始逐渐渗入人们的日常生活&#xff0c;发挥着不可替代的作…

算法刷题|0-1背包问题、416.分割等和子集

0-1背包问题 什么是0-1背包&#xff1f; 有i个物品和一个容量为j的背包&#xff0c;每个物品有重量和价值两个属性&#xff1b;求容量为j的背包能装的物品的最大价值是多少。每个物品智能使用一次。 二维dp数组 dp[i][j]的含义&#xff1a;表示从前i个物品中&#xff0c;当前…

C++中引用的基本内容

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 引用&#xff0c;其实没啥特别的&#xff0c;就是起外号&#xff0c;或者说起小名。就比如说孙悟空就有很多外号&#xff0c;如…

为何C语言的函数调用要用到堆栈,而汇编却不需要自定义栈

一 ≠ 汇编不需要堆栈 汇编中一般不初始化&#xff0c;也就是直接使用系统的堆栈而已&#xff0c;自己定义堆栈还是要初始化的。 之前看了很多关于uboot的分析&#xff0c;其中就有说要为C语言的运行&#xff0c;准备好堆栈。 而自己在Uboot的start.S汇编代码中&#xff0c…

一文详细介绍查看和启用nginx日志(access.log和error.log),nginx错误日志的安全级别,自定义访问日志中的格式

文章目录 1. 文章引言2. Nginx访问日志(access.log)2.1 简述访问日志2.2 启用Nginx访问日志2.3 自定义访问日志中的格式 3. Nginx错误日志(error.log)3.1 简述错误日志3.2 启用错误日志3.3 Nginx错误日志的安全级别 4. 文末总结 1. 文章引言 我们在实际工作中&#xff0c;经常使…

学习spark笔记

✨ 学习 Spark 和 Scala 一 ​ &#x1f426;Spark 算子 spark常用算子详解&#xff08;小部分算子使用效果与描述不同&#xff09; Spark常用的算子以及Scala函数总结 Spark常用Transformations算子(二) Transformation 算子(懒算子)&#xff1a;不会提交spark作业&#…

SLAM论文速递:SLAM—— 流融合:基于光流的动态稠密RGB-D SLAM—4.25(2)

论文信息 题目&#xff1a; FlowFusion:Dynamic Dense RGB-D SLAM Based on Optical Flow 流融合:基于光流的动态稠密RGB-D SLAM论文地址&#xff1a; https://arxiv.org/pdf/2003.05102.pdf发表期刊&#xff1a; 2020 IEEE International Conference on Robotics and Automa…

flex布局属性详解

Flex布局 flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content其他orderflexalign-self 含义:Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 flex-direction flex-direction属性决定主轴的方向&…

危险区域闯入识别系统 yolov8

危险区域闯入识别系统通过YOLOv8网络模型技术&#xff0c;危险区域闯入识别系统对现场画面中发现有人违规闯入禁区&#xff0c;系统立即抓拍告警同步回传后台。YOLOv8 提供了一个全新的 SOTA 模型&#xff0c;包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例…