spring 存储对象 + 获取对象

news2024/11/24 13:54:00

前言

本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中,了解如何使用注释来获取容器中的Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
    • 1.通过注释将类加入IoC容器中
      • Maven项目创建,前提准备:
      • 添加注释 - 储存Bean对象
        • 1.类注释存储spring
        • java中的标准分层 - 写程序时根据这些分层
        • 2.方法注释存储Bean对象
    • 2. 获取Bean对象 / 对象装配
      • 属性注入
      • 构造方法注入
      • Setter注入
  • 总结

本文开始

1.通过注释将类加入IoC容器中

Maven项目创建,前提准备:

1.查看是否添加依赖成功

在这里插入图片描述

2.配置扫描路径:自定义
位置处于自己创建的.xml文件中,路径内容只需要修改自己创建的路径即可;
配置完路径:会扫描路径下的类,有注释的加入容器中;

在这里插入图片描述

添加注释 - 储存Bean对象

1.类注释存储spring

类注释的目的:看到类注释,就能了解当前类的用途;
a)@Controller:控制器存储,校验参数合法性;
b)@Service:服务存储,业务组装(方法组装),看调用什么方法,不进行业务的实现;- 告诉你办理什么业务;
c)@Repository:仓库存储(数据持久层),进行实际业务的处理 ; - 实际去办一个个业务;
d)@Component:组件存储,工具类层,通用的工具;
e)@Configuration:配置存储,配置层,对项目进行设置;

使用: - 在所创建的类上,添加对应注释即可;

在这里插入图片描述

【注】

  • Bean的命名规则:(获取加注解的默认id)对于第一个字母大写,第二个字母小写默认id使用小写 - 符合规则前两个字母小写;StudentUser => studentUser
    不满足首字母大写 && 第二个字母小写,使用原来id - 非默认情况,id为原类名不变;THead => THead

Bean的命名规则源码:

在这里插入图片描述

  • 存储Bean,可以使用注解存储,也可以使用xml,存储Bean,二者也可以混用;(类不在同一个包里,可以使用Bean的方式存储)

java中的标准分层 - 写程序时根据这些分层

在这里插入图片描述

2.方法注释存储Bean对象

【注】
1.@Bean注释,加在方法上的;
2.@Bean注释,必须配合五大类注释一起使用;

为什么需要与五大类注释配合使用呢?
方法太多,寻找一个方法,可能会扫描包下的所有方法,相比较来说类比较少,通过类找方法会快很多;

@Bean与五大类配合使用代码示例:
推荐使用@Component

在这里插入图片描述

3.获取@Bean命名方式:@Bean的默认命名 == 方法名(id == 方法名)

但是这样命名有弊端,如果方法名为getxxx(), setxxx(), 这样调用这个对象是不恰当的,所以就需要给方法重新命名;再获取Bean对象就是根据重命名来获取;

重命名@Bean方式:给@Bean添加属性,设置名称;
a)@Bean(“abc”) : 没写属性,直接命名
b)@Bean(name = “bb”) : 写属性name并设置命名
c)@Bean(value = “cc”) :写属性value并命名

【注】
① 命名可以指定多个命名 : @Bean(name = {“aa”, “bb”})
② 对@Bean重命名后,就不能使用原来的方法名来获取对象;
③ 对于类注释,不支持起多个命名;(相当于不能给一个类取多个命名)
④ 对于@Bean名称,如果多个@Bean使用相同的名称,程序不报错,在同一个类中,除第一个@Bean之后的对象不会被存放到容器中,再有相同名称的Bean存储时,容器自动忽略不存储;

如果使用@Bean重命名,命名名称一样:就需要根据加载顺序来确定,通过@Order() 来声明一个类的加载时机,@Order() 中括号中的值越大,就先加载通过那个类;
@Order(100) > @Order(1) ;

在这里插入图片描述

2. 获取Bean对象 / 对象装配

获取对象 / 对象注入:取出一个对象放到某个类中;

获取对象的注释:@Autowired 或者 @Resource

@Resource注入 作用类似 @Autowired 二者区别:
1.@Resource 来自 jdk; @Autowired 来自Spring框架;
2.支持参数个数不同:@Resource 支持多参数设置;@Autowired 只支持一个参数设置;
3.使用方式不同:@Resource 不支持构造方法注入;@Autowired 支持构造方法注入;
4.idea兼容性支持不同:@Resource 不存在报错情况;@Autowired 在专业版情况下可能报错;(解决报错方法:@Autowired(required = false) 给括号中设置false值,表明此时对象不存在也可以)

属性注入

属性注入属于:通过注释从容器中获取对象,注入到设置的变量中,在之后的方法中就能使用;

优点:属性注入,使用简单;
缺点:无法注入 final 修饰的对象;
通用性 - 只适用于 IoC容器;
【注】被final修饰的变量需要直接复制 或者 在构造方法中进行赋值;

在这里插入图片描述

问题:同一类型Bean存储到容器多个,获取Bean时出现错误;

在这里插入图片描述

解决方式:
a) 将属性的名字 和 Bean的名字对应上;

在这里插入图片描述

b) 使用@Autowried + @Qualifier()进行筛选

在这里插入图片描述

c) 使用@Resource 设置name名称指定获取某个对象;

在这里插入图片描述

构造方法注入

构造方法注入使用:在构造方法上添加@Autowired, 从容器中获取UserRepository对象注入到对应属性中;

优点:可以注入一个final修饰的对象;
注入的对象不会被修改,构造方法 只会加载一次;
构造方法注入可以保证 对象完全初始化;
构造方法通用性更好;
缺点
写法复杂;
使用构造方法注入,无法解决循环依赖的问题;

@Service
public class User4 {
    private UserRepository userRepository;
//在构造方法上添加@Autowired
    @Autowired
    public User4(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

Setter注入

setter注入使用:在setter方法上加上@Autowired, 在执行对应类时,会从容器中拿到对象,并注入到setter中的参数;

优点:符合单一设计原则 - Setter只有set一个属性
缺点:无法注入final修饰的变量;
setter注入的对象可以被修改;(setter本身可能被多次调用修改)

@Service
public class User3 {
    private UserRepository userRepository;
    //@Autowired注释setter就会从容器中获取对应对象,再注入到对应参数UserRepository属性中;
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

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

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

相关文章

【C++ 重要知识点总结】自定义类型-类和结构体

类 类的基本特性 数据抽象和封装继承多态 1 类的构成——抽象 概念 数据抽象是一种依赖于接口和实现的分离的编程技术。类的接口包括用户所能执行的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需要的的各种私有函数。封装实现了类的接口和实…

645. 错误的集合

645. 错误的集合 class Solution { public static int[] findErrorNums(int[] nums) {Arrays.sort(nums);int dup-1;int miss1;for (int i 1; i < nums.length; i) {if(nums[i]nums[i-1]){dupnums[i];}if(nums[i]-nums[i-1]>1){missnums[i]-1;}}return new int[]{dup,…

Vmware vSphere 5.0系列

Vmware vSphere 5.0 我们都用过 vmware workstation 这款产品&#xff0c;可以使我们安装很多虚拟机&#xff0c;但是 vmware 的核心产品远非局限于 workstation。 vSphere 是 VMware 推出的基于云的新一代数据中心虚拟化套件&#xff0c;提供了虚拟化基础架构、高可用性、集…

Tesseract开源的OCR工具及python pytesseract安装使用

一 、介绍 Tesseract是一款由Google赞助的开源OCR。 pytesseract是python包装器&#xff0c;它为可执行文件提供了pythonic API。 Tesseract 已经有 30 年历史&#xff0c;开始它是惠普实验室的一款专利软件&#xff0c;在2005年后由Google接手并进一步开发和完善。Tesseract支…

【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学

前言 【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学一、XCharts介绍1.1 特性1.2 相关网站链接1.3 效果展示 二、XCharts导入三、XCharts快速使用3.1 添加一个简单图表3.2 添加多个Seire3.3 给图表添加其他组件3.4 添加Serie组件&#xff0c;如…

什么是Maven,Maven的概述及基本使用

MAVEN 一、Maven简介1.1、Maven概述1.2、Maven仓库1.3项目获取jar包过程 二、Maven使用2.1Maven安装配置2.1.1配置环境变量2.1.2配置本地仓库2.1.3配置阿里云私服 2.2Maven基本使用2.2.1Maven常用指令2.2.2Maven生命周期 总结 一、Maven简介 Apache Maven是一个项目管理和构建…

自动驾驶数据标注有哪些?

自动驾驶汽车&#xff1a;人工智能(AI)的焦点 人工智能驱动汽车解决方案的市场规模预计到 2025年将增长十倍以上&#xff0c;提升车内体验的商机领域以及 AI 模型的无偏见训练数据的重要性。在本篇中&#xff0c;我们将介绍车外体验的关键组成部分&#xff0c;以及自动驾驶数据…

Python 爬虫的学习 day01 ,爬虫的基本知识, requests 和 charde模块, get函数的使用

1.Python 爬虫 1.1什么是网络爬虫 网络爬虫&#xff0c;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本&#xff0c;另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 1.2 网络爬虫的特…

2023/7/26总结

最近都花时间在项目上 修改了发布文章的界面 然后文章可以上传图片了 修改了个人主页的界面&#xff08;这里把js代码注释掉了&#xff0c;所以没用内容&#xff09; 大概画了一下管理员的界面 和消息列表的界面 做了评论的界面&#xff1a;&#xff08;还没开始写&#xff0c…

“华为杯”研究生数学建模竞赛2019年-【华为杯】F题:多约束条件下智能飞行器航迹快速规划

目录 摘 要&#xff1a; 一、 问题重述 1.1 问题背景 1.2 需要解决的问题 二、 模型假设 三、符号说明 四、问题一 4.1 问题描述与分析 4.2 模型建立 4.2.1 数据处理 4.2.2 航迹规划模型建立 4.3 求解算法建立 4.3.1 最短路径数学表达 4.3.2 自适应改进型 Dijkstr…

力扣热门100题之合并区间【中等】

题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;interv…

Docker啥是数据持久化?

文章目录 数据持久化数据卷相关命令创建读写数据卷创建只读数据卷数据卷共享数据卷容器实现数据卷共享nginx实现数据卷共享nfs总结 Dockerfile持久化Dockerfile方式docker run总结 数据持久化 ​ 在容器层的 UnionFS&#xff08;联合文件系统&#xff09;中对文件/目录的任何修…

动态分段的JavaScript实现【线性参考】

有许多很酷的 GIS 应用程序将海拔和距离结合在一起。 当用户沿着高程图拖动光标时&#xff0c;地图上的位置通常会更新。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 在尝试将此功能构建到我的一个项目中时&#xff0c;我了解到它需要一种称为线性参考&#xff08;…

java排序算法之插入排序

文章目录 &#x1f4cb;插入排序概念&#x1f4d6;实现步骤&#x1f516;代码示例 &#x1f4c8;总结 &#x1f4cb;插入排序概念 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它将数组划分为已排序和未排序两个部分&#xff0c;每次从未排序部分…

iTOP-RK3568开发板Docker 安装 Ubuntu 18.04

Docker 下载安装 Ubuntu18.04&#xff0c;输入以下命令&#xff1a; sudo apt update docker pull ubuntu:18.04 切换 Shell 到 Ubuntu 18.04&#xff0c;输入以下命令&#xff1a; docker container run -p 8000:3000 -it ubuntu:18.04 /bin/bash -p 参数&#xff1a;容器的…

Shell脚本学习-shift语句的使用

[rootvm1 scripts]# help shift shift: shift [n]Shift positional parameters.Rename the positional parameters $N1,$N2 ... to $1,$2 ... If N isnot given, it is assumed to be 1.Exit Status:Returns success unless N is negative or greater than $#.说明&#xff1a…

vue解决跨域访问问题(个人学习笔记六)

目录 友情提醒第一章、跨越问题解决1.1&#xff09;什么是跨域问题&#xff1f;1.2&#xff09;第一种解决方式&#xff1a;后端设置允许跨域访问1.3&#xff09;第二种解决方式&#xff1a;前端配置代理 第二章、配置代理服务器2.1&#xff09;配置简单代理服务器2.2&#xff…

GPT-AI 使用的技术概览

ChatGPT 使用的技术概览 智心AI-3.5/4模型&#xff0c;联网对话&#xff0c;MJ快速绘画 从去年 OpenAI 发布 ChatGPT 以来&#xff0c;AI 的能力再次惊艳了世人。在这样的一个时间节点&#xff0c;重新去学习相关技术显得很有必要。 ChatGPT 的内容很多&#xff0c;我计划采用…

Git下载与安装

文章目录 一、Git下载二、Git安装1.双击下载好的安装包进行安装2.Next3.选择Git的安装目录(不要带有中文和空格)→Next4.Next5.Next6.Next7.Next8.Next9.Next10.Next11.Next12.Next13.Next14.Next15.Next16.Install17.等待安装18.Finish19.鼠标光标放到系统桌面右击看到如下图所…

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织

前言 在数据科学和数据分析领域&#xff0c;Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具&#xff0c;帮助我们高效地处理和分析数据。其中&#xff0c;索引在Pandas中扮演着关键角色&#xff0c;它是一种强大的数据组织和访问机制&#xff0c;使我们…