【JavaEE】-- IoC DI

news2026/3/16 13:35:05
文章目录1. Spring、Spring Boot 和 Spring MVC 的关系和区别?(常见面试题)1.1 Sring1.2 Spring MVC1.3 Spring Boot1.4 总结2. IoC2.1 Bean的存储2.2 Bean的命名2.3 方法注解Bean2.3.1 定义多个对象2.3.2 Bean的重命名2. 4 Bean生效3. DI依赖注入3.1 属性注入3.2 构造方法注入3.3 Setter注入3.4 面试题三种注入方式的缺点分析4.5 Autowired 注入存在的问题4.5.1 Primary4.5.2 Qualifier4.5.3 Resource5. 面试题常见的注解有哪些分别是什么作用6. 面试题Autowired 和 resource 的区别7. 面试题什么是IoC?8. 面试题ApplicationContext 和 BeanFactory1. Spring、Spring Boot 和 Spring MVC 的关系和区别?(常见面试题)1.1 Sring简单来说Spring 是一个应用开发框架(轻量级、一站式、模块化)是包含了众多工具方法的IoC容器。其目的是用于简化企业级应用程序开发。Spring的主要功能是管理对象以及对象之间的依赖关系面向切面编程数据库事务管理数据访问web框架支持等。但是Spring 具备高度可开放性并不强制依赖Spring开发者可以自由选择Spring的部分或者全部Spring可以无缝继承第三方框架。1.2 Spring MVCSpring MVC是Spring 的一个子框架Spring诞生之后大家觉得很好用于是按照MVC模式涉及了一个MVC框架主要用于开发Web应用和网络接口所以Spring MVC是一个Web框架。Spring MVC 是基于Spring进行开发的天生的与Spring框架集成。可以让我们更简洁的进行Web层的开发支持灵活的URL到页面控制器的映射提供了强大的约定大于配置的契约式编程支持非常容易与其他视图框架集成。1.3 Spring BootSpring Boot 是对Spring的一个封装为了简化Spring应有的开发而出现的中小型企业没有成本研究自己的框架使用Spring Boot可以更加快速的搭建框架降低开发成本让开发人员更加专注Spring应用的开发而无需过多的关注XML的配置和一些底层的实现。Spring Boot是一个脚手架可以快速的集成其他框架进来。比如想要使用Spring Boot 开发Web项目只需要引入Spring MVC框架即可Web开发的工作是Spring MVC 完成的而不是Spring Boot想要完成数据访问只需要引入Mybatis框架即可。Spring Boot只是辅助简化项目开发的让开发变的更加简单甚至不需要额外的Web服务器直接生成jar包执行即可。1.4 总结Spring MVC 和 Spring Boot 都属于Spring Spring MVC是基于Spring的一个MVC框架而Spring Boot 是基于Spring 的一套快速开发整合包。这三者专注的领域不同解决的问题也不一样。总的来说Spring就像一个大家族有众多衍生产品但他们的基础都是Spring。2. IoCSpring 是一个IOC(控制反转)容器作为容器那么就具备最基础的功能存 取。Spring 容器管理的主要是对象我们将这些被Spring管理的对象称之为“Bean”。我们把这些对象交给Spring管理由Spring来负责对象的创建和销毁。程序只需要告诉Spring哪些对象需要存以及如何从Spring中取出对象。2.1 Bean的存储有两类注解形式可以实现把对象交给IoC容器管理1. 类注解(五大注解)Controller、Service、Repostory、Component、Configuration2. 方法注解Bean为什么需要这么多类注解呢这个和应用分层是呼应的。让程序员看到类注解之后就能直接了解到当前类的用途。2.2 Bean的命名五⼤注解存储的bean① 前两位字⺟均为⼤写, bean名称为类名② 其他的为类名⾸字⺟⼩写③ 通过 value属性设置 Controller(value “user”)Bean 注解存储的bean① bean名称为⽅法名②通过name属性设置Bean(name {u1,user1})2.3 方法注解Bean方法注解Bean要配合类注解才能生效。2.3.1 定义多个对象ConfigurationpublicclassUserInfoConfig{BeanpublicUserInfouser1(){UserInfouserInfonewUserInfo(1,zhangsan,13);returnuserInfo;}BeanpublicUserInfouser2(){UserInfouserInfonewUserInfo(2,lisi,13);returnuserInfo;}}定义多个对象的时候我们就不能通过类型来获取对象了需要使用Bean的名称来获取。SpringBootApplicationpublicclassSpringIocDemoApplication{publicstaticvoidmain(String[]args){ApplicationContextcontextSpringApplication.run(SpringIocDemoApplication.class,args);UserInfobean1(UserInfo)context.getBean(user1);UserInfobean2(UserInfo)context.getBean(user2);System.out.println(bean1);System.out.println(bean2);}}运行结果2.3.2 Bean的重命名通过name属性来对Bean对象进行重命名。ConfigurationpublicclassUserInfoConfig{//Bean重命名Bean(name{zhangsan,user111})publicUserInfouser1(){UserInfouserInfonewUserInfo(1,zhangsan,13);returnuserInfo;}}这样我们就可以通过zhangsan 和 user111任意一个名称来获取到Bean对象。SpringBootApplicationpublicclassSpringIocDemoApplication{publicstaticvoidmain(String[]args){ApplicationContextcontextSpringApplication.run(SpringIocDemoApplication.class,args);UserInfobean(UserInfo)context.getBean(zhangsan);UserInfobean2(UserInfo)context.getBean(user111);System.out.println(bean);System.out.println(bean2);}}运行结果无论名称是一个还是有多个name{}都可以省略如Bean(“zhangsan”, “user111”)2. 4 Bean生效Bean想要生效需要被Spring扫描到。默认的扫描范围是Spring Boot启动类所在的包及其子包。3. DI依赖注入依赖注入是一个过程是指IOC容器在创建Bean时去提供运行时所依赖的资源而资源指的就是对象。Spring对于依赖注入提供了三种方式1. 属性注入2. 构造方法注入3. Setter注入3.1 属性注入属性注入时使用Autowired注解实现的。代码示例将service类注入到Controller中。service类代码实现importorg.springframework.stereotype.Service;ServicepublicclassUserService{publicvoiddoService(){System.out.println(UserService.doService);}}controller类代码实现importcom.bubu.ioc.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassUserController{//属性注入AutowiredprivateUserServiceuserService;publicvoidsayHi(){System.out.println(hi UserController);userService.doService();}}获取Controller中的sayHi方法SpringBootApplicationpublicclassSpringIocDemoApplication{publicstaticvoidmain(String[]args){//获取Spring上下⽂对象ApplicationContextcontextSpringApplication.run(SpringIocDemoApplication.class,args);//从Spring上下⽂中获取对象UserControlleruserController(UserController)context.getBean(userController);//使⽤对象userController.sayHi();}}ApplicationContext是什么Application是Spring 上下文。由于我们把对象都交给Spring来进行管理了所以获取对象要从Spring中来获取就先得到Spring的上下文。上下文是什么比如我们应用进行线程切换的时候切换前都会把线程的状态信息暂时存储起来这里的上下文就包括了当前线程的信息等下次该线程又竞争到CPU上运行的时候从上下文中拿到线程上次运行的信息。这个上下文就是指当前的运行环境也可以看作是一个容器。容器里面存放了很多的内容这些内容就是当前运行的环境。3.2 构造方法注入构造方法注入是在类的构造方法中实现注入的。importcom.bubu.ioc.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassUserController5{privateUserServiceuserService;AutowiredpublicUserController5(UserServiceuserService){this.userServiceuserService;}publicvoidsayHi(){System.out.println(hi UserController5);userService.doService();}}注意如果类只有一个构造方法那么Autowired注解可以省略。如果类中有多个构造方法那么需要添加上Autowired来明确指定到底使用哪个构造方法。3.3 Setter注入Setter注入需要在设置set方法的时候加上Autowired注解。importcom.bubu.ioc.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassUserController6{privateUserServiceuserService;AutowiredpublicvoidsetUserService(UserServiceuserService){this.userServiceuserService;}publicvoidsayHi(){System.out.println(hi UserController5);userService.doService();}}3.4 面试题三种注入方式的缺点分析1. 依赖注入优点简洁使用方便。缺点①、只能用于IoC容器如果是非IoC容器不可用并且只有在使用的时候才会出现NPE空指针异常。②、不能注入一个Final修饰的属性。2. 构造函数注入Spring 4.x推荐优点①、可以注入final修饰的属性。②、注入的对象不会被修改。③、依赖对象在使用前一定会被完全初始化因为依赖是在类的构造方法中执行的而构造方法是在类加载阶段就会执行的方法。④、通用性好。构造放是JDK支持的所以更换任何框架他都是适用的。缺点注入多个对象时代码会比较繁琐。3. Setter注入Spring 3.x推荐优点方便在类实例之后重新对该对象进行配置或者注入。缺点①、不能注入Final修饰的属性。②、注入对象可能会被改变因为Setter方法可能会被多次调用就会有被修改的风险。4.5 Autowired 注入存在的问题当同一类型存在多个bean的时候使用Autowired注解会存在问题。ConfigurationpublicclassUserInfoConfig{BeanpublicUserInfouser1(){UserInfouserInfonewUserInfo(1,zhangsan,13);returnuserInfo;}BeanpublicUserInfouser2(){UserInfouserInfonewUserInfo(2,lisi,13);returnuserInfo;}}SpringBootApplicationpublicclassSpringIocDemoApplication{publicstaticvoidmain(String[]args){ApplicationContextcontextSpringApplication.run(SpringIocDemoApplication.class,args);UserControllerbeancontext.getBean(UserController.class);bean.sayHi();}}运行结果报错的原因是非唯一的Bean对象。解决方案1. Primary2. Qualifier3. Resource4.5.1 PrimaryConfigurationpublicclassUserInfoConfig{BeanPrimary//指定该Bean为默认Bean的实现publicUserInfouser1(){UserInfouserInfonewUserInfo(1,zhangsan,13);returnuserInfo;}BeanpublicUserInfouser2(){UserInfouserInfonewUserInfo(2,lisi,13);returnuserInfo;}}4.5.2 QualifierQualifier注解不能单独使用必须配合Autowired注解使用ControllerResponseBodypublicclassUserController{AutowiredprivateUserServiceuserService;AutowiredQualifier(user2)privateUserInfouserInfo;publicvoidsayHi(){userService.doService();System.out.println(userInfo);System.out.println(UserController.sayHi......);}}4.5.3 Resource该注解是按照bean的名称进行注入的。通过name属性指定要注入的bean的名称。ControllerResponseBodypublicclassUserController{AutowiredprivateUserServiceuserService;Resource(nameuser2)privateUserInfouserInfo;publicvoidsayHi(){userService.doService();System.out.println(userInfo);System.out.println(UserController.sayHi......);}}5. 面试题常见的注解有哪些分别是什么作用web url映射RequestMapping参数接收和接口响应RequestParamRequestBodyResponseBodyBean的存储Controller, Service, Repository, Component, Configuration, Bean’Bean的获取Autowired, Qualifier, Resource6. 面试题Autowired和resource的区别Autowired 是Spring 框架提供的注解而Resource是JDK提供的注解。Autowired 默认是按照类型注入的而Resource 是按照名称注入的。相比于Autowired来说Resource 支持更多的参数设置例如name设置根据名称来获取Bean.Autowired装配顺序7. 面试题什么是IoC?IoC: 控制反转。也就是说Spring是一个“控制反转”的容器。也就是获得依赖对象的过程被反转了。当我们需要某个对象时传统开发模式中需要自己通过new来创建对象现在不需我们自己进行创建而是把创建对象的任务交给容器也就是交给Spring。程序中只需要在使用的时候进行依赖注入就好了。我们把这个容器称为IoC容器Spring是一个IoC容器也被称为Spring容器。8. 面试题ApplicationContext 和 BeanFactory1. 继承关系和功能方面Spring容器有两个低级的接口BeanFactory和ApplicationContext.其中BeanFactory提供了基础的访问容器的能力而ApplicationContext 属于BeanFactory的子类它除了继承了BeanFactory的所有功能之外它还拥有独特的特性还添加了对国际化的支持、资源访问支持、以及事件传播等方面的支持。2. 功能方面ApplicationContext是一次性加载并初始化所有Bean对象而BeanFactory 是需要哪个才去加载哪个因此更加轻量空间换时间。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…