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

【JavaEE】-- IoC DI

文章目录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 是需要哪个才去加载哪个因此更加轻量空间换时间。

相关文章:

【JavaEE】-- IoC DI

文章目录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…...

【JavaEE】-- Cookie Session

1. Cookie HTTP协议自身是属于“无状态”协议。 无状态:默认情况下HTTP协议的客户端与服务器之间的这次通信,和下次通信之间没有直接关系。 但是在实际开发中,我们很多时候是需要知道请求之间的关联关系的,比如:保存登…...

Aphrodite-engine高级技巧:模型并行与量化技术的实战应用

Aphrodite-engine高级技巧:模型并行与量化技术的实战应用 【免费下载链接】aphrodite-engine PygmalionAIs large-scale inference engine 项目地址: https://gitcode.com/gh_mirrors/ap/aphrodite-engine Aphrodite-engine作为PygmalionAI开发的大规模推理引…...

Trae Android编程初体验

在AI盛行的年代,ai编程赛道也是红红火火,网上也是吹的不行,我看到过傅盛吹,咱也不知道用的啥高级工具,为什么我选择了Trae来测试,首先它是字节跳动旗下的,大厂精品,其次有同事推荐&a…...

为什么选择Composer Installers?10大优势助你高效管理PHP依赖

为什么选择Composer Installers?10大优势助你高效管理PHP依赖 【免费下载链接】installers A Multi-Framework Composer Library Installer 项目地址: https://gitcode.com/gh_mirrors/in/installers Composer Installers 是一个多框架 Composer 库安装工具&…...

pip使用笔记(python包的管理工具)、全局镜像

文章目录命令pip freeze命令配置全局镜像地址全局镜像地址-参考配置全局镜像地址-配置私库示例其他pip是python包的管理工具,就像npm是node包的管理工具一样。命令 安装: pip install django # 安装djangopip install -e . # 这里的.表示当前路径&…...

工作流整理

现在加了uk环境 1 jira分任务 2 按jira ticket name起branch进行开发,开发完成后写ut 3 本地测试过后,准备AT test case,升version,推到dev env 4 跑AT,测试通过后提pr 5 pr merge到main后上sit,hk上完上uk…...

FPGA 50 ,Xilinx Vivado 2020 版本安装流程,以及常见问题解析,附中文翻译( Vivado 2020 版本安装教程 )

前言 Xilinx 统一安装程序(Unified Installer) 是进行 FPGA 与异构计算平台开发的重要基础工具,集成了 Vivado、Vitis 以及相关文档与设备支持组件。正确完成安装是后续进行硬件设计、软件开发与系统验证的前提。 本文以 Xilinx 统一安装程序 2020.1 为例,结合实际安装过…...

Email-Spec与RSpec完美结合:编写可维护的邮件测试用例

Email-Spec与RSpec完美结合:编写可维护的邮件测试用例 【免费下载链接】email-spec email-spec/email-spec: Email-Spec 是一个用于 Ruby on Rails 中邮件功能测试的库,提供了多种邮件功能测试的示例和教程,可以用于测试 Ruby on Rails 应用程…...

OpenTelemetry Operator路线图解读:未来功能与社区发展方向

OpenTelemetry Operator路线图解读:未来功能与社区发展方向 【免费下载链接】opentelemetry-operator Kubernetes Operator for OpenTelemetry Collector 项目地址: https://gitcode.com/gh_mirrors/op/opentelemetry-operator OpenTelemetry Operator是一个…...

DeepSeek-OCR-2多场景:制造业设备铭牌OCR→自动关联设备台账系统

DeepSeek-OCR-2多场景:制造业设备铭牌OCR→自动关联设备台账系统 1. 场景痛点与解决方案 在制造业设备管理中,设备铭牌信息录入一直是个让人头疼的问题。传统方式需要人工逐个查看铭牌,手动录入设备型号、序列号、生产日期等关键信息到设备…...

synthetic-credit-default-syncora vs 传统数据集:10个维度全面对比分析

synthetic-credit-default-syncora vs 传统数据集:10个维度全面对比分析 【免费下载链接】synthetic-credit-default-syncora High-fidelity synthetic dataset for credit default modeling 项目地址: https://gitcode.com/gh_mirrors/sy/synthetic-credit-defau…...

oinone-pamirs扩展开发:自定义组件与SPI机制详解

oinone-pamirs扩展开发:自定义组件与SPI机制详解 【免费下载链接】oinone-pamirs 项目地址: https://gitcode.com/gh_mirrors/oi/oinone-pamirs oinone-pamirs是一个功能强大的开源项目,提供了灵活的扩展开发能力,其中自定义组件和SP…...

从Vim到Neovim:vim-moonfly-colors主题跨平台使用指南

从Vim到Neovim:vim-moonfly-colors主题跨平台使用指南 【免费下载链接】vim-moonfly-colors A dark charcoal theme for modern Neovim & classic Vim 项目地址: https://gitcode.com/gh_mirrors/vi/vim-moonfly-colors vim-moonfly-colors是一款适用于现…...

Buildroot调试技巧:从BR2_ENABLE_DEBUG到gdb交叉调试全流程

Buildroot调试技巧:从BR2_ENABLE_DEBUG到gdb交叉调试全流程 【免费下载链接】buildroot Buildroot, making embedded Linux easy. Note that this is not the official repository, but only a mirror. The official Git repository is at http://git.buildroot.net…...

图图的嗨丝造相-Z-Image-Turbo效果对比:不同提示词下微透肤质感与光影表现力实测

图图的嗨丝造相-Z-Image-Turbo效果对比:不同提示词下微透肤质感与光影表现力实测 1. 引言:当AI遇见“微透肤”的质感挑战 最近在玩一个挺有意思的AI图像生成模型,叫“图图的嗨丝造相-Z-Image-Turbo”。听名字就知道,它专门擅长生…...

Stable-Diffusion-v1-5-archive入门必看:负向提示词设置+种子复现+分辨率优化全解析

Stable-Diffusion-v1-5-archive入门必看:负向提示词设置种子复现分辨率优化全解析 1. 引言:从“能用”到“好用”的关键一步 如果你刚接触 Stable Diffusion v1.5 Archive,可能会觉得有点懵:明明照着别人的描述词写了&#xff0…...

SPIRAN ART SUMMONER实战教程:生成带文字铭文的斯皮拉圣器——提示词工程进阶篇

SPIRAN ART SUMMONER实战教程:生成带文字铭文的斯皮拉圣器——提示词工程进阶篇 1. 教程概述:从新手到斯皮拉召唤师 欢迎来到SPIRAN ART SUMMONER的奇幻世界!这是一个将顶尖AI图像生成技术与《最终幻想10》美学完美融合的创作平台。想象一下…...

chandra OCR模型部署:40+语言支持的全球化应用场景

chandra OCR模型部署:40语言支持的全球化应用场景 1. 引言:重新定义文档数字化的智能OCR 在日常工作中,我们经常遇到这样的场景:一堆扫描的合同需要整理归档,大量纸质表格要转为电子版,或者数学试卷需要数…...

GME-Qwen2-VL-2B-Instruct代码实例:向量点积相似度计算+归一化分数映射完整实现

GME-Qwen2-VL-2B-Instruct代码实例:向量点积相似度计算归一化分数映射完整实现 1. 项目概述与核心价值 GME-Qwen2-VL-2B-Instruct是一个强大的多模态视觉语言模型,但在实际使用中发现官方指令缺失会导致图文匹配打分不准确的问题。本文介绍的解决方案通…...

LabelMe与深度学习:标注数据到模型训练的完整流程

LabelMe与深度学习:标注数据到模型训练的完整流程 【免费下载链接】labelme Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). 项目地址: https://gitcode.com/gh_mirrors/lab/labelme …...

Stanford Alpaca指令微调原理:从Self-Instruct到52K数据集构建

Stanford Alpaca指令微调原理:从Self-Instruct到52K数据集构建 【免费下载链接】stanford_alpaca Code and documentation to train Stanfords Alpaca models, and generate the data. 项目地址: https://gitcode.com/gh_mirrors/st/stanford_alpaca Stanfor…...

SAM 2自动掩码生成详解:图像分割效率提升10倍的秘诀

SAM 2自动掩码生成详解:图像分割效率提升10倍的秘诀 【免费下载链接】sam2 The repository provides code for running inference with the Meta Segment Anything Model 2 (SAM 2), links for downloading the trained model checkpoints, and example notebooks t…...

10分钟部署Botpress:面向开发者的简易安装教程

10分钟部署Botpress:面向开发者的简易安装教程 【免费下载链接】botpress The open-source hub to build & deploy GPT/LLM Agents ⚡️ 项目地址: https://gitcode.com/gh_mirrors/bo/botpress Botpress是构建下一代聊天机器人和AI助手的开源平台&#…...

gh_mirrors/car/carbon API完全指南:集成你的应用从未如此简单

gh_mirrors/car/carbon API完全指南:集成你的应用从未如此简单 【免费下载链接】carbon 项目地址: https://gitcode.com/gh_mirrors/car/carbon carbon是一个强大的代码美化和分享工具,通过其API可以轻松将代码美化功能集成到你的应用中。本文将…...

Solarized色彩一致性测试:跨平台显示设备校准方案

Solarized色彩一致性测试:跨平台显示设备校准方案 【免费下载链接】solarized precision color scheme for multiple applications (terminal, vim, etc.) with both dark/light modes 项目地址: https://gitcode.com/gh_mirrors/so/solarized Solarized是一…...

Stanford Alpaca数据许可协议:CC BY NC 4.0使用限制详解

Stanford Alpaca数据许可协议:CC BY NC 4.0使用限制详解 【免费下载链接】stanford_alpaca Code and documentation to train Stanfords Alpaca models, and generate the data. 项目地址: https://gitcode.com/gh_mirrors/st/stanford_alpaca Stanford Alpa…...

mmdetection视频检测教程:实时处理与优化技巧

mmdetection视频检测教程:实时处理与优化技巧 【免费下载链接】mmdetection open-mmlab/mmdetection: 是一个基于 PyTorch 的人工智能物体检测库,支持多种物体检测算法和工具。该项目提供了一个简单易用的人工智能物体检测库,可以方便地实现物…...

LabelMe二次开发入门:修改源码实现定制功能

LabelMe二次开发入门:修改源码实现定制功能 【免费下载链接】labelme Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). 项目地址: https://gitcode.com/gh_mirrors/lab/labelme LabelM…...

pydata-book大数据处理技巧:分块读取与内存优化策略

pydata-book大数据处理技巧:分块读取与内存优化策略 【免费下载链接】pydata-book wesm/pydata-book: 这是Wes McKinney编写的《Python for Data Analysis》一书的源代码仓库,书中涵盖了使用pandas、NumPy和其他相关库进行数据处理和分析的实践案例和技术…...