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

更简单的存取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();}

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内容就结束了

 

相关文章:

更简单的存取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...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...