文章目录

  • 一、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
    这两个注解寻找匹配组件的详细差异这里就不过多描述了,网上很多文章,讲的也都比较清楚。

结束。


参考文章:

  1. https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring
  2. 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
  3. https://blog.csdn.net/weixin_40867255/article/details/91049459

Spring基本概念:IoC,DI,Wiring相关推荐

  1. 认识Spring核心容器IoC/DI

    对于 Java 编程来说,使用 Spring 能完成的更加快速,更容易并更安全.Spring 专注于速度,便捷与开发效率,也正是如此,让Spring成为了全世界最流行的 Java 框架.从配置到安全, ...

  2. java元婴期(17)----java进阶(spring(1)----spring基本概念IOC)

    1.spring是什么? Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Orien ...

  3. Spring.Net---4、IoC/DI注入方式

    spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序在调用sp ...

  4. Spring核心概念之DI详解

    目录 什么是DI 注解注入 构造器注入 Set注入(重点) P命名和C命名注入 什么是DI 依赖注入(Dependency Injection,DI). 依赖 : 指Bean对象的创建依赖于sprin ...

  5. 手撸Spring系列4:IOC/DI 思想(实战篇)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  6. 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  7. Spring+IOC(DI)+AOP概念及优缺点

    Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...

  8. java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)

    1.依赖注入的概念 依赖注入:Dependency Injection.它是spring框架核心ioc的具体实现. 我们的程序在编写时,通过控制反转,把对象的创建交给了spring,但是代码中不可能出 ...

  9. Spring详解—— IOC 和 DI 区别

    1.本章前言 我们只要提到Spring这个词,有简单了解过Spring的人基本上都会脱口而出IoC.DI和AOP这几个概念.但是对于初学者来说,一下子搞懂IoC和DI的概念还是挺麻烦的.比如之前我自己 ...

  10. Spring框架IoC/DI原理及实现

    1.概念 IoC:指将对象的创建权,交给到Spring容器: DI :指Spring创建对象的过程中,将对象依赖的属性通过配置的方式自动的设值给当前的对象 . IoC/DI注解详解 完成IoC/DI, ...

最新文章

  1. iOS开发之UIDevice通知
  2. Lexus Extroic OpenCart 2.X 自适应主题模板 ABC-0648-03
  3. 亿级 ELK 日志平台构建实践
  4. python 之 click 包,设置命令行参数
  5. C/C++ 中变量的声明、定义、初始化的区别
  6. 【消息果留言板 v1.2】支持回复邮件提醒+页面pc端宽度调整+时间友好显示
  7. 《参考消息》出现大标题错别字硬伤
  8. 我一定要说服他们php,七夕也不行,我一定要说服他们,PHP语言是最好的语言
  9. 如何修改apache 2最大连接数
  10. 正则表达式基础---转自 Python正则表达式指南 前边
  11. MODIS数据下载及MRT批处理方法
  12. 身份证前6位城市代码
  13. 运维工程师遇到的运维事件_运维、运维工程师的相关知识随记
  14. 野火PID上位机通信移植
  15. 儿童节html5小游戏,六一儿童节游戏大全,六一儿童节游戏有哪些
  16. causalml安装记录
  17. 老版人人商城提示“百度未授权地图API”
  18. java短信发送代码_java 短信发送 的 代码
  19. python自动化办公入门故事教案_Python自动化办公知识点整理汇总
  20. mysql 初始化数据库报错

热门文章

  1. zcmu 1919 kirito's 星爆气流斩(多重背包转01背包,并且进行2进制优化)
  2. Chisel入门------Chisel的基本语法3
  3. win7 + vmware下安装mac os
  4. 一木.溪桥学Python-11:迭代器、生成器、面象对象class MyClass:、self 参数、 __init__() 方法、__str__() 方法
  5. Leetcode每日一题1371
  6. 计算机基础知识ppt课件10页,2019第 1 章 计算机基础知识ppt课件.ppt
  7. [附源码]java毕业设计民宿网站管理系统
  8. windows上最好用的文件管理软件 Directory Opus
  9. 光棍节必会之抛媚眼英语地道说法
  10. TFN DC700S手持式无线电监测接收机怎么样?