Spring基本概念:IoC,DI,Wiring
文章目录
- 一、IoC(控制反转)
- 二、DI(依赖注入)
- 三、Bean configuration(配置)
- 1. XML Schema-based configuration:基于XML模式的配置
- 2. Annotation-based Container Configuration:基于注解的配置(简化XML配置)
- 3. Java-based Container Configuration:通过Java程序配置(完全摆脱XML文件)
- 四、再回到DI(依赖注入)
- 1. Constructor-Based DI(构造器注入)
- 2. Setter-Based DI(Set方法注入)
- 3. Field-Based DI(字段注入)
- 五、Bean Wiring(装配)
- 1. 基于XML Schema-based configuration的装配方式
- 2. 基于Annotation-based和Java-based Container Configuration的装配方式
刚接触Spring不久,突然想搞清楚到底什么是IoC(控制反转),什么是DI(依赖注入),什么是Bean configuration(配置),什么是Bean Wiring(装配)。发现很多中文文章都解释的不够好,看了很久都还挺懵的状态,最后看了英文文档,搞清楚了,整理如下。
一、IoC(控制反转)
英文:Inversion of Control is a principle in software engineering which transfers the control of objects or portions of a program to a container or framework.
中文:控制反转是软件工程中的一个原理,它将对象或程序部分的控制转移到容器或框架中。
IoC是个principle,是面向对象编程的一种设计原理,设计思想,设计法则。
传统的应用程序里,所有对象都是由程序创建。譬如一个对象A如果依赖另外一个对象B的时候,是直接在对象A内部通过new进行创建对象B,或者其他途径获取已经被某个程序创建好的对象B,是程序主动创建并主动获得依赖对象。而IoC是有专门一个容器来创建这些对象,当A依赖B的时候,也是由容器来进行注入的。对于A来说,创建和获取依赖对象就由主动变成了被动,所以是反转。
我们可以通过各种机制实现控制反转,例如:策略设计模式、服务定位器模式、工厂模式和依赖注入(DI)。
二、DI(依赖注入)
英文:Dependency injection is a pattern we can use to implement IoC, where the control being inverted is setting an object’s dependencies.
中文:依赖注入是一种我们可以用来实现IoC的模式,其中被反转的控件正在设置对象的依赖关系。
DI是个pattern,是面向对象编程的一种设计模式。
在Spring中,依赖注入可以通过3种方式来完成:constructors, setters or fields。在讲这3种依赖注入之前,需要先看一下Spring中的Bean configuration(配置),也就是容器如何创建Bean并对其进行管理。
三、Bean configuration(配置)
1. XML Schema-based configuration:基于XML模式的配置
譬如:
<bean id="store" class="org.baeldung.store.Store" />
这样容器就会调用Store的无参构造器对其实例化,得到store对象。
2. Annotation-based Container Configuration:基于注解的配置(简化XML配置)
最基础的注解是@Component
,这个注解表示类是Spring的组件bean,即会被Spring扫描成bean,相当于xml配置文件中的<bean>
。@Component
主要是写在类的定义的地方。
@Component
public class Store {}
和第一点类似,容器就会调用Store的无参构造器对其实例化,得到store对象。对象名默认是类名的第一个字母小写。
另外还有一些注解,譬如@Service
、@Controller
,这些都是基于@Component
的,只是为了更加明确组件的含义。
还有一个@Bean
注解,主要用在方法上,标明该方法的返回对象是个组件bean。针对无法修改源码的第三方类,就可以用这个方式将其配置为组件。
3. Java-based Container Configuration:通过Java程序配置(完全摆脱XML文件)
使用@Configuration
注解来修饰类,表示这个Java类是Spring配置类,Spring启动的时候会加载配置类。用来替代XML,相当于把该类作为spring的XML配置文件中的<beans>
。
- 配合
@Bean
使用。被注解的类内部可以包含0个或多个被@Bean
注解的方法。 - 配合
@ComponentScan(value = "xx.xx")
使用,表示该配置类扫描哪个包,从而获得该包下面配置的组件bean。相当于XML中的<context:component-scan base-package="xx.xx"/>
四、再回到DI(依赖注入)
1. Constructor-Based DI(构造器注入)
譬如下面的Store对象依赖的Item对象是由容器通过调用构造函数进行注入:
public class Store {private Item item;public Store(Item item) {this.item = item;}
}
那么容器具体如何寻找合适的bean?
- 使用XML Schema-based configuration
<bean id="item1" class="org.baeldung.store.ItemImpl1" />
<bean id="store" class="org.baeldung.store.Store"> <constructor-arg type="ItemImpl1" index="0" name="item" ref="item1" />
</bean>
- 使用Annotation-based和Java-based Container Configuration
@Component
public class Store {private Item item;public Store(Item item) {this.item = item;}
}@Configuration
public class AppConfig {@Beanpublic Item item1() {return new ItemImpl1();}
}
- 使用Java-based Container Configuration
@Configuration
public class AppConfig {@Beanpublic Item item1() {return new ItemImpl1();}@Beanpublic Store store() {return new Store(item1());}
}
2. Setter-Based DI(Set方法注入)
其实和构造器注入基本一样。譬如下面的Store对象依赖的Item对象是由容器通过调用set方法进行注入:
public class Store {private Item item;public setItem(Item item) {this.item = item;}
}
- 使用XML Schema-based configuration
<bean id="item1" class="org.baeldung.store.ItemImpl1" />
<bean id="store" class="org.baeldung.store.Store"><property name="item" ref="item1" />
</bean>
- 使用Annotation-based和Java-based Container Configuration
@Component
public class Store {private Item item;public setItem(Item item) {this.item = item;}
}@Configuration
public class AppConfig {@Beanpublic Item item1() {return new ItemImpl1();}
}
3. Field-Based DI(字段注入)
使用@Autowired
注解,或者@Resource
。
public class Store {@Autowiredprivate Item item;
}
Bean配置就不在赘述了,和前面的一样。使用XML,或者@Component
,或者@Configuration
配置item bean。
说到这里,就引出了Bean Wiring(装配)。
五、Bean Wiring(装配)
前面讲到注入方式,组件配置方式,但是容器到底是如何选择一个组件进行注入的?
1. 基于XML Schema-based configuration的装配方式
no
: 显示指定,前面的例子都是显示指定。无论是构造器注入还是set方法注入,在xml中都使用ref
指定了使用哪个bean。可用于构造器注入和set方法注入。byName
: 通过组件名称寻找组件进行注入。主要用于set方法注入。
<bean id="store" class="org.baeldung.store.Store" autowire="byName"> </bean>
byType
: 通过组件类型寻找组件进行注入。主要用于set方法注入。
<bean id="store" class="org.baeldung.store.Store" autowire="byType"> </bean>
constructor
: 通过构造函数参数的组件类型寻找组件注入,本质就是byType
。主要用于构造器注入。
<bean id="store" class="org.baeldung.store.Store" autowire="constructor"> </bean>
2. 基于Annotation-based和Java-based Container Configuration的装配方式
@Autowired
: 默认byType
,可以配合@Qualifier
实现byName
@Resource
: 这个注解属于J2EE,先byName
,再byType
这两个注解寻找匹配组件的详细差异这里就不过多描述了,网上很多文章,讲的也都比较清楚。
结束。
参考文章:
- https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring
- https://blog.csdn.net/key_768/article/details/105935908?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-11&spm=1001.2101.3001.4242
- https://blog.csdn.net/weixin_40867255/article/details/91049459
Spring基本概念:IoC,DI,Wiring相关推荐
- 认识Spring核心容器IoC/DI
对于 Java 编程来说,使用 Spring 能完成的更加快速,更容易并更安全.Spring 专注于速度,便捷与开发效率,也正是如此,让Spring成为了全世界最流行的 Java 框架.从配置到安全, ...
- java元婴期(17)----java进阶(spring(1)----spring基本概念IOC)
1.spring是什么? Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Orien ...
- Spring.Net---4、IoC/DI注入方式
spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序在调用sp ...
- Spring核心概念之DI详解
目录 什么是DI 注解注入 构造器注入 Set注入(重点) P命名和C命名注入 什么是DI 依赖注入(Dependency Injection,DI). 依赖 : 指Bean对象的创建依赖于sprin ...
- 手撸Spring系列4:IOC/DI 思想(实战篇)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
- 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
- Spring+IOC(DI)+AOP概念及优缺点
Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...
- java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)
1.依赖注入的概念 依赖注入:Dependency Injection.它是spring框架核心ioc的具体实现. 我们的程序在编写时,通过控制反转,把对象的创建交给了spring,但是代码中不可能出 ...
- Spring详解—— IOC 和 DI 区别
1.本章前言 我们只要提到Spring这个词,有简单了解过Spring的人基本上都会脱口而出IoC.DI和AOP这几个概念.但是对于初学者来说,一下子搞懂IoC和DI的概念还是挺麻烦的.比如之前我自己 ...
- Spring框架IoC/DI原理及实现
1.概念 IoC:指将对象的创建权,交给到Spring容器: DI :指Spring创建对象的过程中,将对象依赖的属性通过配置的方式自动的设值给当前的对象 . IoC/DI注解详解 完成IoC/DI, ...
最新文章
- iOS开发之UIDevice通知
- Lexus Extroic OpenCart 2.X 自适应主题模板 ABC-0648-03
- 亿级 ELK 日志平台构建实践
- python 之 click 包,设置命令行参数
- C/C++ 中变量的声明、定义、初始化的区别
- 【消息果留言板 v1.2】支持回复邮件提醒+页面pc端宽度调整+时间友好显示
- 《参考消息》出现大标题错别字硬伤
- 我一定要说服他们php,七夕也不行,我一定要说服他们,PHP语言是最好的语言
- 如何修改apache 2最大连接数
- 正则表达式基础---转自 Python正则表达式指南 前边
- MODIS数据下载及MRT批处理方法
- 身份证前6位城市代码
- 运维工程师遇到的运维事件_运维、运维工程师的相关知识随记
- 野火PID上位机通信移植
- 儿童节html5小游戏,六一儿童节游戏大全,六一儿童节游戏有哪些
- causalml安装记录
- 老版人人商城提示“百度未授权地图API”
- java短信发送代码_java 短信发送 的 代码
- python自动化办公入门故事教案_Python自动化办公知识点整理汇总
- mysql 初始化数据库报错
热门文章
- zcmu 1919 kirito's 星爆气流斩(多重背包转01背包,并且进行2进制优化)
- Chisel入门------Chisel的基本语法3
- win7 + vmware下安装mac os
- 一木.溪桥学Python-11:迭代器、生成器、面象对象class MyClass:、self 参数、 __init__() 方法、__str__() 方法
- Leetcode每日一题1371
- 计算机基础知识ppt课件10页,2019第 1 章 计算机基础知识ppt课件.ppt
- [附源码]java毕业设计民宿网站管理系统
- windows上最好用的文件管理软件 Directory Opus
- 光棍节必会之抛媚眼英语地道说法
- TFN DC700S手持式无线电监测接收机怎么样?