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

以及Spring中为什么会出现IOC容器?@Autowired和@Resource注解?

以及Spring中为什么会出现IOC容器?@Autowired和@Resource注解?

IOC容器发展史

没有IOC容器之前
首先说一下在Spring之前,我们的程序里面是没有IOC容器的,这个时候我们如果想要得到一个事先已经定义的对象该怎么得到呢?比如我们在想要得到一个事先定义的Person对象。

首先我们需要先在person.xml文件里面提前配置生成我们的Person对象,如下:

<bean id="person" class="com.example.Person"><property name="name" value="John"/><property name="age" value="25"/>
</bean>

然后在程序代码里面需要用到Person对象的时候,我们需要从xml文件里面取出来,需要写一段繁琐的代码,如下图:

public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("person.xml");Person person = (Person) context.getBean("person");System.out.println("Name: " + person.getName());System.out.println("Age: " + person.getAge());}
}

这样当我们获取一个已经提前生成的对象的时候,可以发现代码非常的多,非常冗余。

有IOC容器之后
当有了IOC容器之后,我们就把类似于person.xml的xml文件取消了,配置文件底层还是有的,但是我们程序员不用写xml配置文件了,我们只需要写一个注解就可以了,Spring底层会帮助我们把带有注解的类转换成对应的xml配置文件或者配置文件里面的一部分的。

如果你想要把Person对象之前提前定义好,那么不直接给Person对象加上一个@Component注解就可以了,然后Person对象就可以自动的加入到对应的person.xml文件了。在Spring中,内部是一个IOC容器,你可以理解成加了@Component注解的对象都被自动的加入到了IOC容器里面了。

如果你想要从IOC容器里面取出已经定义好的Person对象,也不用像之前那样了,需要写好多的代码,现在你只需要写一个@Autowire注解或者@Resource注解就可以了。可以直接加在某个类的Person对象属性的上头。

发现没有有了IOC容器之后可以极大的简化我们的程序代码。能我们的程序代码变得更简单易读了。

把不同的类注入到IOC容器中使用的注解不同

@Component注解
如果你的类只是一个简单的类,没有任何逻辑,比如说Person类,那么我们把这个类注入到IOC容器使用的注解是@Component注解。

@Controller注解
如果你的类是Controller控制器,需要定义前端的访问接口的,那么我们给这个类使用@Controller把其注入到IOC容器中。

@Service注解
如果你的类是业务类,如果你想要把这个类注入到IOC容器中,需要用到@Service注解。

@Repository注解
如果你的类是与数据库交互的类,那么需要使用@Repository注解。

同时把一个类中的多个属性类加入到IOC容器中该怎样操作?

上面我们使用@Component,@Controller,@Service,@Repository这些注解的时候,都是把一个对象类加入到IOC容器里面,那假如我现在想要同时把多个类加入到IOC容器里面,该怎么办?

可以使用@Configuration和@Bean的组合,代码如下:

@Configuration
public class AppConfig {@Beanpublic ClassA classA() {return new ClassA();}@Beanpublic ClassB classB() {return new ClassB();}@Beanpublic ClassC classC() {return new ClassC();}
}

AppConfig配置类里面的多个类ClassA,ClassB,ClassC都会被加入到IOC容器里面,对应到xml文件的id名字就是方法的名字,class对象类型就是return的返回类型,property就是对象里面的各个属性。

不过不要忘记我们的配置类一定要被Spring扫描一下,这样才能够加入到IOC容器里面,扫描的注解是@ComponentScan,参数加上配置类所在的包的路径即可。但是有时候我们可以给主启动类省略@ComponentScan这个注解,为什么呢?因为程序默认就会扫描主启动类所在的包下面的所有类,然后把对应的类注入到IOC容器中。如下图:
在这里插入图片描述
因为主类OrderMain80在springcloud包下面,因此这个包下面的所有的类都会被自动扫描。但Myrule包下面的类不能被自动扫描。

@Autowired和@Resource注解的区别

class MyTest {@Autowiredprivate Person person;
}

@Aturowired是通过类型注入,它会把IOC容器里面类型是Person的对象,注入到MyTest的person属性中。但是有个问题,就是如果IOC容器里面只有一个Person对象的类型,那么我们直接可以把IOC容器里面的这个对象注入给MyTest的person属性,不会有任何问题。但是如果IOC容器里面有多个Person对象的类型呢?这个时候我们注入那个Person对象给MyTest的person属性呢?答案是不知道,因此现在仅仅通过@Autowired注解肯定不行了,我们需要加上个@Qualifier(“person”)注解,这样可以通过IOC容器里面的对象的名字进行注入,其实底层就是通过person.xml文件的id为person的bean来找到一个唯一相关的对象进行注入的。

@Resource是通过bean的id名字进行注入的,@Resource就相当于是@Autowired和@Qualifier的组合,但是又不完全是,为什么呢?

  • @Resource注解要求IOC容器中必须有相关对象,否则会出异常。如果IOC容器中这个类型的对象只有一个,那么@Resource注解是按照类型注入;但是如果IOC容器中这个类型的对象有多个,那么@Resource注解是按照名称注入;而@Autowired注解可以允许IOC容器里面没有相关的对象,默认@Autowired注解的required属性的值为true,就是必须需要对象,如果IOC容器没有相关对象会报错,但是当我们把这个属性值设置为false的时候,既便IOC容器中没有相关对象也不会报错了,此时会返回一个null值。

相关文章:

以及Spring中为什么会出现IOC容器?@Autowired和@Resource注解?

以及Spring中为什么会出现IOC容器&#xff1f;Autowired和Resource注解&#xff1f; IOC容器发展史 没有IOC容器之前 首先说一下在Spring之前&#xff0c;我们的程序里面是没有IOC容器的&#xff0c;这个时候我们如果想要得到一个事先已经定义的对象该怎么得到呢&#xff1f;…...

nss刷题(3)

1、[SWPUCTF 2021 新生赛]include 根据提示传入一个file后显示了关于flag的代码 这是一个文件包含&#xff0c;考虑php伪协议&#xff0c;构造payload&#xff1a; ?filephp://filter/readconvert.base64-encode/resourceflag.php 2、[SWPUCTF 2021 新生赛]Do_you_know_http …...

Qt编译和使用freetype矢量字库方法

在之前讲过QT中利用freetype提取字库生成图片的方法&#xff1a; #QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段&#xff0c;结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBi…...

Java interface 接口

接口(interface) 接口的理解 接口就是规范&#xff0c;定义的是一组规则&#xff0c;体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个"是不是"的is-a关系&#xff0c;而接口实现则是 "能不能"的has-a关系。 接口的本质是契约、标准、规范…...

深入理解MySQL:查询表的历史操作记录

摘要&#xff1a;在数据库管理中&#xff0c;了解如何查询表的历史操作记录对于追踪数据变更、审计数据以及恢复误操作至关重要。本文将深入探讨MySQL中查询表的历史操作记录的方法&#xff0c;并提供多个实例以帮助读者更好地理解和应用这一技术。 引言 在数据库管理中&#…...

【Centos7+JDK1.8】Jenkins安装手册

一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins&#xff0c;直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…...

SpringBootWeb 篇-深入了解 Mybatis 概念、数据库连接池、环境配置和 Lombok 工具包

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文件目录 1.0 Mybatis 概述 2.0 数据库连接池 2.1 数据库连接池的主要作用包括 2.2 如何切换数据库连接池&#xff1f; 3.0 配置环境 4.0 Lombok 工具包 4.1 如何导入到项目中呢…...

JAVA开发 基于最长公共子序列来计算两个字符串之间的重复率

计算两个字符串之间的重复率 最长公共子序列实现代码 最长公共子序列 基于最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;的重复率的中心逻辑是首先找到两个或多个序列中同时出现的、不一定连续但保持相对顺序的最长子序列&#xff0c;然后计算这个最…...

Android HAL到Framework

一、为什么需要Framwork? Framework实际上是⼀个应⽤程序的框架&#xff0c;提供了很多服务&#xff1a; 1、丰富⽽⼜可扩展的视图&#xff08;Views&#xff09;&#xff0c; 可以⽤来构建应⽤程序&#xff0c;它包括列表&#xff08;lists&#xff09;&#xff0c;⽹格&am…...

Python数据可视化(七)

绘制 3D 图形 到目前为止&#xff0c;我们一直在讨论有关 2D 图形的绘制方法和绘制技术。3D 图形也是数据可视化的 一个很重要的应用方面&#xff0c;我们接下来就重点讲解有关 3D 图形的实现方法。绘制 3D 图形通常需要导 入 mpl_toolkits 包中的 mplot3d 包的相关模块&#x…...

StringMVC

目录 一&#xff0c;MVC定义 二&#xff0c;SpringMVC的基本使用 2.1建立连接 - RequestMapping("/...") ​编辑 2.2请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.参数重命名 5.传递数组 6. 传递集合 7.传递JSON数据 8. 获取url中数据 9. 传递文…...

前端基础入门三大核心之HTML篇 —— SVG的viewBox、width和height:绘制矢量图的魔法比例尺【含代码示例】

前端基础入门三大核心之HTML篇 —— SVG的viewBox、width和height&#xff1a;绘制矢量图的魔法比例尺【含代码示例】 基本概念与作用viewBoxwidth和height 代码示例与实践基础示例动态调整示例 不同角度的使用思路保持比例缩放自动适应容器 实际问题与解决方案结语与讨论 在前…...

Java-Zookeeper

zookeeper是什么 一个分布式、开源的分布式应用程序协调服务&#xff0c;具有配置维护、域名服务、分布式同步、组服务等 zookeeper有哪些功能 功能简介集群管理监控节点状态、运行请求等主节点选举主节点挂掉之后会执行新主选举分布式锁zookeeper提供两种锁&#xff1a;独占…...

Godot游戏引擎有哪些优势

哈喽呀&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;众所周知在当今游戏开发领域&#xff0c;各种游戏引擎如雨后春笋般涌现&#xff0c;为开发者提供了丰富的选择。而在这些众多的选择中&#xff0c;Godot游戏引擎以其独特的特性和开放源代码的优势&…...

一张图看懂大模型性价比:能力、价格、并发量全面PK

最近&#xff0c;国内云厂商的大模型掀起一场降价风暴。火山引擎、阿里云、百度云等纷纷宣布降价&#xff0c;部分模型价格降幅据称高达99%&#xff0c;甚至还有些模型直接免费。 五花八门的降价话术&#xff0c;一眼望去遍地黄金。但事实真的如此吗&#xff1f;今天我们就拨开…...

设计井字棋游戏(一)

创建游戏登录注册窗口 用户名admin 密码admin&#xff08;可自行改变&#xff09; 主页面 1. 导包 import pickle&#xff1a;导入 pickle 模块&#xff0c;这是一个 Python 的内置模块&#xff0c;用于将 Python 对象序列化和反序列化。序列化是指将对象转换为字节流&am…...

华为手机卡顿(仅针对于部分人来说,我也不清楚是否真的有用)

关机&#xff01; 之前一段时间手机变得特别卡顿&#xff0c;然后网上搜了一堆教程一点用没有&#xff0c;结果因为昨天下午在考试所以把手机关机了一个多小时&#xff0c;再打开之后手机就变得很流畅&#xff0c;原因不详&#xff0c;但效果显著&#xff0c;如有需要可尝试一…...

7、按钮无法点击

不能点击&#xff0c;打开f12&#xff0c;删除disabled...

开源博客项目Blog .NET Core源码学习(25:App.Hosting项目结构分析-13)

本文学习并分析App.Hosting项目中后台管理页面的文章管理页面。   文章管理页面用于显示、检索、新建、编辑、删除文章数据&#xff0c;以便在前台页面的首页、文章专栏、文章详情页面显示文章数据。文章管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑文章数据。…...

第七节 ConfigurationClassParser 源码分析

tips&#xff1a; ConfigurationClassParser 是 Springframework 中的重要类。 本章主要是源码理解&#xff0c;有难度和深度&#xff0c;也枯燥乏味&#xff0c;可以根据实际情况选择阅读。 位置&#xff1a;org.springframework.context.annotation.ConfigurationClassPars…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...