当前位置: 首页 > 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…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...