面试解答系列:什么是Spring的依赖注入?哪些方法进行依赖注入?

Java面试系列-Spring面试题20道,结合手撕Java系列学习效果更佳,知识点更深入 1. Spring框架的主要优点是什么? 2. 解释一下Spring的IoC(控制反转)和DI(依赖注入)。 3. Spring中有哪几种Bean的作用域? 4. 解释一下Spring的事务管理。 5. 解释一下Spring MVC的工作原理。 6. 解释一下Spring的AOP(面向切面编程)。 7. 解释一下Spring Boot的特点。 8. 解释一下Spring Data JPA。 9. 解释一下Spring Security。 阅读详情

通过优锐课核心java学习笔记中,我们可以看到什么是Spring的依赖注入?哪些方法进行依赖注入?,码了很多专业的相关知识, 分享给大家参考学习。

Spring 能有效地组织J2EE应用各层的对象。不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调、运行。Spring将各层的对象以松耦合的方式组织在一起,Action对象无须关心Service对象的具体实现,Service对 象无须关心持久层对象的具体实现,各层对象的调用完全面向接口。当系统需要重构时,代码的改写量将大大减少。

上面所说的一切都得宜于Spring的核心机制,依赖注入。依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。理解依赖注入

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。

(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者自己创建被调用者。

(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。对应Spring的依赖注入。

第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。

第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。

所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:

Set注入
这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口):

package com.bless.springdemo.action;

public class SpringAction {
//注入对象springDao
private SpringDao springDao;
//一定要写被注入对象的set方法
public void setSpringDao(SpringDao springDao) {
this.springDao = springDao;
}
public void ok(){
springDao.ok();
}
}
随后编写spring的xml文件,中的name属性是class属性的一个别名,class属性指类的全名,因为在SpringAction中有一个公共属性Springdao,所以要在标签中创建一个标签指定SpringDao。标签中的name就是SpringAction类中的SpringDao属性名,ref指下面<bean name=“springDao”…>,这样其实是spring将SpringDaoImpl对象实例化并且调用SpringAction的setSpringDao方法将SpringDao注入:

构造器注入 这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:

public class SpringAction {
//注入对象springDao
private SpringDao springDao;
private User user;
public SpringAction(SpringDao springDao,User user){
this.springDao = springDao;
this.user = user;
System.out.println(“构造方法调用springDao和user”);
}
public void save(){
user.setName(“卡卡”);
springDao.save(user);
}
}

在XML文件中同样不用的形式,而是使用标签,ref属性同样指向其它标签的name属性:

解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:
下面是设置index,就是参数位置:
Xml代码

另一种是设置参数类型:
Xml代码

静态工厂的方法注入 静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取: Java代码

package com.bless.springdemo.factory;
import com.bless.springdemo.dao.FactoryDao;
import com.bless.springdemo.dao.impl.FactoryDaoImpl;
import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;
public class DaoFactory {
//静态工厂
public static final FactoryDao getStaticFactoryDaoImpl(){
return new StaticFacotryDaoImpl();
}
}
同样看关键类,这里我需要注入一个FactoryDao对象,这里看起来跟第一种注入一模一样,但是看随后的xml会发现有很大差别:
public class SpringAction {
//注入对象
private FactoryDao staticFactoryDao;
public void staticFactoryOk(){
staticFactoryDao.saveFactory();
}
//注入对象的set方法
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
this.staticFactoryDao = staticFactoryDao;
}
}
Spring的IOC配置文件,注意看指向的class并不是FactoryDao的实现类,而是指向静态工厂DaoFactory,并且配置 factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法:

实例工厂的方法注入 实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法: Java代码

public class DaoFactory {
//实例工厂
public FactoryDao getFactoryDaoImpl(){
return new FactoryDaoImpl();
}
}
那么下面这个类没什么说的,跟前面也很相似,但是我们需要通过实例工厂类创建FactoryDao对象:

public class SpringAction {
//注入对象
private FactoryDao factoryDao;
public void factoryOk(){
factoryDao.saveFactory();
}
public void setFactoryDao(FactoryDao factoryDao) {
this.factoryDao = factoryDao;
}
}
最后看spring配置文件:

总结

Spring IOC注入方式用得最多的是(1)(2)种,多谢多练就会非常熟练。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群 V–(ddmsiqi)来交流学习,里面都是同行,验证【优快云2】有资源共享。
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

47个经典Spring面试题详解(附带答案) ​这篇文章主要分享了47个Spring经典面试题,现在分享给大家,也给大家做个参考。正好现在金三银四,希望对大家有所帮助,有用的话点赞支持! 一、一般问题 二、依赖注入(Ioc) 三、Beans 四、注解 五、数据访问 六、AOP 七、MVC ... 阅读详情

相关推荐

面试题解答系列:在 Spring中如何注入java集合

您已经看到了如何配置基本数据类型使用value属性和使用标签的ref属性在你的bean配置文件中的对象引用。这两种情况下处理过单值到一个bean。 现在什么样,如果你想通过多元价值,如Java Collection类型List, Set, Map 及 Properties。要处理这种情况,Spring提供了四种类型的如下集合的配置元素: 元素 描述 list 这有助于注入值列表Li...

AD_plus的博客 2430

Spring依赖注入

一、什么是依赖注入 DI (Dependency Injection):依赖注入是指在 Spring IOC 容器创建对象的过程中,将所依赖的对象通过配置进行注入。我们可以通过依赖注入的方式来降低对象间的耦合度。 在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使对象之间的耦合越小越好。 1 类的关系 继承、实现、依赖、关联、聚合、组合。 2 关系强度 继承 = 实现 > 组合 > 聚合 > 关联 > 依赖 二、为什

m0_62356365的博客 3613

Java面试第八山!《Spring框架》

征服Spring框架必读:解密Java开发核弹级武器。你是否还在被Java开发的复杂配置折磨?是否想彻底搞懂大厂面试必问的IoC、AOP底层玄机?这篇文章将带你直击Spring框架心脏!

TFHoney的博客 1300

Spring 依赖注入详解

/ 依赖关系,指的就是对象之间的相互协作关系依赖注入(DI)是一个过程,在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项(即与该对象一起工作的其他对象)。然后,容器在创建 bean 时注入这些依赖项。这个过程基本上是与对象直接通过构造类或等机制来控制其依赖项的实例化或位置是相反的,因此得名控制反转。// 对象不直接创建自己,而是通过 Spring 容器创建,那么 Spring 容器是如何创建对象的?

swadian2008的博客 5325

来咯来咯,最新整理41道Spring和Spring AOP面试题(带答案)

最新整理41道spring和spring aop面试题 前言: 最近有很多小伙伴们私信我要spring的面试题,所以又给大家整理了一下,这里有41道spring和spring aop的面试题,由于篇幅限制,只有前二十个在这文章里带答案,需要其他面试题答案的可以关注我的公众号 Java 周某人 就获取免费领取方式! 1.什么是spring? Spring 是个ja...

Javazhoumou的博客 970

spring面试题目自我解答

Aop 面向切面 是spring的一种编程思想。目的是把业务逻辑和系统逻辑区分开。我们专注的是业务逻辑,而系统逻辑不是我们关注的点,这就可以借助于Aop帮助我们完成。还是以保存数据库为例:我们关注的是增删改查,以查为例,我们关注的代码是用哪个字段去查,然而,操作数据库我们必须要先开启数据库,加载数据库驱动,完了还要关闭数据库,搞不好还要回滚。很繁琐,一急还容易给忘了,这些就属于系统逻辑。所以Ao...

小爷欣欣 450

Spring框架----Spring的依赖注入

1.spring的依赖注入的概念 依赖注入:dependency Injection IOC的作用:降低程序之间的依赖关系,但不是消除。 依赖关系的管理:以后都交给了spring来维护 在当前类中需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明 依赖关系的维护:称之为依赖注入 依赖注入:能注入的数据有三类 基本类型和String 其他的bean类型(在配置文件中配置过的bean) 复杂类型/集合类型 注入的方式有三种 第一种:使用构造函数提供 第二种:使用set方法提供 第三种:使

Java硬件工程师的博客 2124

HDMI采集芯片 ADV7611采集PC数据调试总结

开发环境:TI DM365 平台, ADV7611采集板, CCS5.5 第一步:I2C调通 这张是 ADV7611 读写的时序图,可以看出在写和读的时候发送地址数据的时候的停止位信息是不同的,在写的时候是不需要停止位的,但是读的时候是要停止位的。如果I2C在硬件没问题的时候可以考虑是不是这方面的问题。 第二步:map 配置: 根据官方推荐配置进行配置:   0x98,

带头奋青的博客 1万+

什么是Spring的依赖注入(Dependency Injection,简称DI)?

在传统的编程模式中,对象通常通过自身创建和管理其依赖对象,导致对象间的紧耦合关系和难以维护的代码。而依赖注入则将对象的依赖关系交由外部容器来管理,从而解耦对象之间的关系,提高代码的可维护性和灵活性。具体来说,依赖注入通过容器将对象所依赖的其他对象(称为依赖项)注入到对象中,而不是在对象内部主动创建或查找依赖项。开发者可以在对象中实现特定的接口,并将依赖项作为接口的方法参数,容器会自动将相应的依赖项传递给对象。开发者可以在对象的构造函数中声明依赖项的参数,容器会在创建对象时自动解析并提供相应的依赖项。

学亮编程手记 418

一款值得关注的开源企业管理ERP系统

盒木ERP是一款开源的现代化企业管理系统,采用前后端分离架构,后端基于Python+Django,前端使用Vue+Ant Design。系统涵盖采购、销售、库存、财务等核心业务模块,支持移动端操作和PDA扫码。具有开源免费、技术先进、功能完善等特点,适合中小企业使用或二次开发。项目提供详细部署指南,支持Docker容器化部署,是学习ERP系统开发和企业数字化转型的优秀选择。

1108

别再手动巡检了!vRealize Operations Manager 8.x 自动化报告配置全攻略(附模板下载)

本文详细介绍了如何利用vRealize Operations Manager 8.x实现自动化巡检报告配置,大幅提升虚拟化运维效率。通过模板定制、智能调度和自动分发等功能,帮助运维团队告别手动生成报告的繁琐工作,实现90%以上的时间节省。文章还提供了实用的配置技巧和最佳实践,助力企业构建高效的自动化报告系统。

weixin_33806859的博客 298

SpringBoot系列面试题

Spring框架是一个开源的Java全栈应用开发框架,核心模块包括控制反转(IoC)和面向切面编程(AOP),旨在简化企业级Java应用的开发。其主要模块有核心容器、AOP、数据访问/集成、Web开发和测试模块。Spring的IoC和DI是其核心思想,通过容器管理对象的创建和依赖关系,降低耦合度。Spring Bean的生命周期包括实例化、属性赋值、Aware接口回调、初始化、BeanPostProcessor处理、使用和销毁等阶段。Spring Boot通过注解和自动配置简化了这些流程,提升了开发效率。

weixin_46519306的博客 2442

别再只画版图了!用ADS RFPro的Circuit模型,快速评估滤波器加电容后的性能变化

本文详细介绍了如何利用ADS RFPro的Circuit模型功能,实现射频滤波器设计中版图与集总元器件的高效协同仿真。通过混合仿真技术,工程师可以快速评估滤波器加电容后的性能变化,大幅缩短设计迭代周期,提升工作效率。文章还提供了实战案例和高级技巧,帮助读者掌握这一创新设计方法。

weixin_28559803的博客 258

Java面试-Spring 中的 IoC(控制反转)与 DI(依赖注入)原理

《Java面试200问》系列聚焦Spring核心机制,深入解析IoC与DI原理。文章生动对比传统对象创建方式与Spring容器的优势,系统讲解三种依赖注入方式(构造函数注入、Setter注入、字段注入)的优缺点及适用场景,推荐首选构造函数注入。同时剖析Spring容器的核心组件BeanFactory与ApplicationContext的差异,帮助开发者理解Spring的"控制反转"哲学。通过理论结合实践的方式,为Java开发者提供面试必备的Spring核心知识体系,助力技术成长与面试准

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

射频功率放大器设计实战:从理论到Layout的全流程解析

本文以一款40W、960MHz LDMOS功率放大器为例,系统解析了从理论分析、仿真设计到版图实现的射频功率放大器设计全流程。内容涵盖AB类放大器选型、核心指标定义、稳定性分析、Load-Pull/源牵引仿真、史密斯圆图匹配、偏置网络设计,以及最终的谐波平衡仿真与版图电磁验证,为工程师提供了一套从理论到实践的完整设计方法论。

weixin_29266007的博客 249

智能车学习日记【二】————十字和斜入十字

智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可

bsefef的博客 2740

Java全栈面试宝典:线程机制与Spring依赖注入深度解析

💬 你在项目中更倾向于使用哪种依赖注入方式?遇到过哪些注入难题?🎁 关注+转发,抽送《阿里Java开发手册》电子书。:便于通过构造器传递Mock对象。注解延迟初始化资源密集型Bean。在Spring Boot中通过。:确保依赖项在初始化后不变。实现环境特定的Bean装配。:启动时立即发现依赖问题。:避免并发修改依赖项。实现类型安全配置注入。

2403_89107873的博客 1314

华为交换机系统软件升级和安全漏洞修复教程

在华为交换机国网可以查询到华为交换机官方电话:400-822-9999,通过下命令查询出需要升级的交换机软件版本和补丁版本号发给华为,获取新的升级系统软件和补丁以及升级教程。下面是我升级华为交换机总结的教程,作为参考。...

星如雨落 2965

30道Spring高频面试题,学完吊打面试官(实用干货!!!)

本文旨在为准备参加Spring框架面试的开发者提供全面的指导。Spring作为Java企业级开发的主流框架,以其轻量级、依赖注入、AOP(面向切面编程)和模块化等特性而广受欢迎。

小斜同学的博客 5603

【即插即用模块】卷积篇 | TCSVT 2025 | MFACB:多尺度膨胀融合,快速扩大感受野,多尺度特征精准捕捉!

本文提出了一种新型多尺度融合膨胀卷积模块MFACB,用于增强语义分割任务中的特征表达能力。该模块通过三分支串联膨胀卷积结构快速扩大感受野,采用双路径融合机制(基础信息路径+多尺度信息路径)实现高效上下文聚合。相比传统卷积块,MFACB在保持轻量化的同时显著提升了多尺度特征捕捉能力,实验表明其性能优于基础残差块。该模块支持自定义膨胀率和步长调整,可灵活嵌入不同网络阶段,适用于需要特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 311

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

面试常被问的25个Spring知识点

关注公众号:nick_coding1024 150道Java面试基础题(含答案) 25个经典的Spring面试问答 本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时就会被问到。对于本文中未提...

程序大视界 1486

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring依赖注入的三种方式:@Autowired、@Resource、@Inject的全面对比与最佳实践

在软件工程领域,依赖注入(Dependency Injection, DI)作为一种设计模式,已经成为现代Java应用开发的核心范式。它的核心思想是将对象间的依赖关系从代码内部转移到外部容器来管理,通过"注入"的方式将依赖对象传递给需要它的组件。这种机制不仅遵循了"控制反转"(IoC)原则,更显著提高了代码的可测试性、可维护性和灵活性。

zuiyuelong的博客 1157

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring常见的面试问题以及解答

都说金三银四,这段时间正好是面试的旺季,说到面试,这两年随着Spring家族的不断壮大,Spring成了面试中必不可少的一个问点。今天我们就来说说面试过程中,经常会问到的关于Spring的一些问题。 Spring 概述 1、什么是Spring Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但有些扩展是针对构建J2EE平台的web应用。Spring...

CalvinXCui的博客 452

Spring面试题大全(2024最新版,附全面解析和答案)

Spring是Java领域最广泛使用的企业级框架之一,提供了全面的基础设施支持,涉及依赖注入、事务管理、AOP、数据访问、Web开发表现和安全性等方面。本文将涵盖Spring框架的基础知识、高级功能及其常见面试题,让大家全面掌握Spring,以应对面试中的各种问题。

科技改变人类,技术成就未来 6206

Spring篇面试题 2024

Spring面试题 2024 每日持续更新中,文中包含Java全技术栈面试题合集跳转链接可直接跳转

qq_58353992的博客 1317
上一篇: Socket 通信原理
下一篇: 面试题解答系列:什么是Spring beans?解释Spring支持的几种bean的作用域
程序员plus
博客等级 码龄8年 41粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值