以及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容器?Autowired和Resource注解? IOC容器发展史 没有IOC容器之前 首先说一下在Spring之前,我们的程序里面是没有IOC容器的,这个时候我们如果想要得到一个事先已经定义的对象该怎么得到呢?…...
nss刷题(3)
1、[SWPUCTF 2021 新生赛]include 根据提示传入一个file后显示了关于flag的代码 这是一个文件包含,考虑php伪协议,构造payload: ?filephp://filter/readconvert.base64-encode/resourceflag.php 2、[SWPUCTF 2021 新生赛]Do_you_know_http …...
Qt编译和使用freetype矢量字库方法
在之前讲过QT中利用freetype提取字库生成图片的方法: #QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段,结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBi…...
Java interface 接口
接口(interface) 接口的理解 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个"是不是"的is-a关系,而接口实现则是 "能不能"的has-a关系。 接口的本质是契约、标准、规范…...
深入理解MySQL:查询表的历史操作记录
摘要:在数据库管理中,了解如何查询表的历史操作记录对于追踪数据变更、审计数据以及恢复误操作至关重要。本文将深入探讨MySQL中查询表的历史操作记录的方法,并提供多个实例以帮助读者更好地理解和应用这一技术。 引言 在数据库管理中&#…...
【Centos7+JDK1.8】Jenkins安装手册
一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins,直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…...
SpringBootWeb 篇-深入了解 Mybatis 概念、数据库连接池、环境配置和 Lombok 工具包
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文件目录 1.0 Mybatis 概述 2.0 数据库连接池 2.1 数据库连接池的主要作用包括 2.2 如何切换数据库连接池? 3.0 配置环境 4.0 Lombok 工具包 4.1 如何导入到项目中呢…...
JAVA开发 基于最长公共子序列来计算两个字符串之间的重复率
计算两个字符串之间的重复率 最长公共子序列实现代码 最长公共子序列 基于最长公共子序列(Longest Common Subsequence, LCS)的重复率的中心逻辑是首先找到两个或多个序列中同时出现的、不一定连续但保持相对顺序的最长子序列,然后计算这个最…...
Android HAL到Framework
一、为什么需要Framwork? Framework实际上是⼀个应⽤程序的框架,提供了很多服务: 1、丰富⽽⼜可扩展的视图(Views), 可以⽤来构建应⽤程序,它包括列表(lists),⽹格&am…...
Python数据可视化(七)
绘制 3D 图形 到目前为止,我们一直在讨论有关 2D 图形的绘制方法和绘制技术。3D 图形也是数据可视化的 一个很重要的应用方面,我们接下来就重点讲解有关 3D 图形的实现方法。绘制 3D 图形通常需要导 入 mpl_toolkits 包中的 mplot3d 包的相关模块&#x…...
StringMVC
目录 一,MVC定义 二,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:绘制矢量图的魔法比例尺【含代码示例】 基本概念与作用viewBoxwidth和height 代码示例与实践基础示例动态调整示例 不同角度的使用思路保持比例缩放自动适应容器 实际问题与解决方案结语与讨论 在前…...
Java-Zookeeper
zookeeper是什么 一个分布式、开源的分布式应用程序协调服务,具有配置维护、域名服务、分布式同步、组服务等 zookeeper有哪些功能 功能简介集群管理监控节点状态、运行请求等主节点选举主节点挂掉之后会执行新主选举分布式锁zookeeper提供两种锁:独占…...
Godot游戏引擎有哪些优势
哈喽呀,大家好呀,淼淼又来和大家见面啦,众所周知在当今游戏开发领域,各种游戏引擎如雨后春笋般涌现,为开发者提供了丰富的选择。而在这些众多的选择中,Godot游戏引擎以其独特的特性和开放源代码的优势&…...
一张图看懂大模型性价比:能力、价格、并发量全面PK
最近,国内云厂商的大模型掀起一场降价风暴。火山引擎、阿里云、百度云等纷纷宣布降价,部分模型价格降幅据称高达99%,甚至还有些模型直接免费。 五花八门的降价话术,一眼望去遍地黄金。但事实真的如此吗?今天我们就拨开…...
设计井字棋游戏(一)
创建游戏登录注册窗口 用户名admin 密码admin(可自行改变) 主页面 1. 导包 import pickle:导入 pickle 模块,这是一个 Python 的内置模块,用于将 Python 对象序列化和反序列化。序列化是指将对象转换为字节流&am…...
华为手机卡顿(仅针对于部分人来说,我也不清楚是否真的有用)
关机! 之前一段时间手机变得特别卡顿,然后网上搜了一堆教程一点用没有,结果因为昨天下午在考试所以把手机关机了一个多小时,再打开之后手机就变得很流畅,原因不详,但效果显著,如有需要可尝试一…...
7、按钮无法点击
不能点击,打开f12,删除disabled...
开源博客项目Blog .NET Core源码学习(25:App.Hosting项目结构分析-13)
本文学习并分析App.Hosting项目中后台管理页面的文章管理页面。 文章管理页面用于显示、检索、新建、编辑、删除文章数据,以便在前台页面的首页、文章专栏、文章详情页面显示文章数据。文章管理页面附带一新建及编辑页面,以支撑新建和编辑文章数据。…...
第七节 ConfigurationClassParser 源码分析
tips: ConfigurationClassParser 是 Springframework 中的重要类。 本章主要是源码理解,有难度和深度,也枯燥乏味,可以根据实际情况选择阅读。 位置:org.springframework.context.annotation.ConfigurationClassPars…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
