面试解答系列:什么是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

《Linux运维总结:Ubuntu22.04忘记root密码解决方案》

《Linux运维总结:Ubuntu22.04忘记root密码解决方案》

东城绝神 4460

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

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

学亮编程手记 418

LaTeX小白必看:5分钟搞定GB/T 7714-2005参考文献格式(Texmaker+BibTeX实战)

本文为LaTeX初学者提供了使用Texmaker编辑器和BibTeX工具链,快速实现GB/T 7714-2005参考文献格式的实战指南。文章详细解析了从获取gbt7714-2005.bst样式文件、编写.bib数据库到四步编译流程的核心步骤,并附有常见问题解决方案,帮助用户高效、准确地完成学术论文的参考文献排版。

weixin_29295541的博客 338

innovus:Clock Gating Check设置与报告

看图后发现,在设置clock gating check之前报告也会有clock gating check的值,这个就是因为timing library中会像reg一样定 library setup time值,如下图。我们常用set_clock_gating_check -setup去过约束Place阶段reg2cgate的时序,以防CTS后由于tree不平导致的时序违例。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1013

SpringBoot系列面试题

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

weixin_46519306的博客 2442

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

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

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

常说的cache机制到底是什么?L1 cache和 L2 cache是什么?

一文带你迅速了解CPU内的cache机制!!图解多核CPU中的多级cache结构。为何有的处理器没有cache?

车载系统攻城狮 5878

大模型LangChain面试题及参考答案(上)

明确的输入输出类型:函数参数需包含类型注解,返回值需定义清晰的数据结构(如JSON格式),便于LLM理解参数含义和调用方式。工具描述:通过文档字符串或独立的描述对象(如Tool类)说明函数的功能、参数用途及调用场景,供LLM判断是否需要调用。示例:定义一个计算两个数之和的工具函数@tool"""计算两个整数的和。参数:- a:第一个整数- b:第二个整数调用场景:当用户需要进行数值加法计算时使用。"""除了内置的。

大模型大数据攻城狮的专栏 1139

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

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

2403_89107873的博客 1314

MicroChip的SmartFusion2的M2S090芯片的全流程开发环境搭建和Demo设计

MicroChip的SmartFusion2的M2S090芯片的全流程开发环境搭建和Demo设计

qq_45806640的博客 458

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

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

小斜同学的博客 5603

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的安全设置导致了桥接失败。如果你是使用校园网,可以换个网络试试,使用校园网的时候,可能会遇到桥接失败。

猿小白的博客 1409

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

程序大视界 1486

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

zuiyuelong的博客 1157

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值