Spring之IOC

简介

首先,官网中有这样一句话:Spring Framework implementation of the Inversion of Control (IoC) principle.这句话翻译过来就是:Spring实现控制反转(IOC)原理,由此可以得出,Inversion of Control(IOC)是一个名为控制反转的原理,而Spring实现了他。而实现这个原理或者说设计原则的最常见的方式也是Spring框架使用的方式叫做依赖注入,也就是Dependency Injection(DI)。因此我们要讲IOC实际上就是要讲Spring是怎样实现IOC和DI的,具体用什么、怎样去做的。

  • 控制反转:类的对象从创建到销毁的整个流程都交给IOC容器去管理
  • 依赖注入:我们通过几种注入的方式将特定的bean注入到IOC容器中。

Bean

Bean是Spring实现IOC的一个重要的概念,官网是这样说的:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

通过这句话我们能看出来,bean实际上就是被Spring IOC容器实例化、组装、管理的对象。也就是说,创建并且管理对象的事儿不用我们去管了,这些都交由Spring框架的IOC容器去管理,这也就是控制反转的思想,而bean就是我们注入的对象。而bean什么时候去实例化将不会再写死在程序中,也就是我们不需要将对象实例化,只需要用的时候去拿就行了,这种方式不仅让我们不用再花心思管理对象,而且也能避免我们自己一些错误的实例化对象导致的内存问题。

Bean的生命周期

  • 单例:当容器创建时创建对象,伴随容器一直处于生存状态,当容器被销毁时对象才被销毁
  • 多例:当对象被使用时创建新的对象,伴随对象的使用一直处于生存状态,当对象在一定时间内不被使用时被GC回收掉

注入Bean的方式

  • 构造函数注入:默认为无参构造,若为无参构造方式注入则需要类中必须存在有效的无参构造函数,不然会报异常
  • Setter 方法注入:通过类中的Setter方法注入实例化对象
  • 字段注入:通过字段名称直接给字段注入值,也可以直接注入Bean,此两个Bean为引用关系

注入相关注解

  • @Autowired:按照类型自动装配对象,如果一个类型对应多个对象则可使用@Qualifier,@Qualifier的作用就是可以通过名称自动装配
  • @Resource:该注解先通过名称进行装配,若没有声明name则根据类的类型进行装配,顺序与@Autowired相反
  • @Bean:主要用在@Configuration注解的类里,也可以用在@Component注解的类里,我们通过查看@Bean的元注解可以看到,他只能作用在其他注解或者类的方法上,Bean默认的名称为方法名,也可自定义名称与别名
  • @Component:用于标记类为Spring管理的组件的一种方式,通过该注解可以将普通的java类变成IOC容器中的一个Bean。该注解是一个泛型注解,可以用于标记任何类型的组件,他有几个常用的、用于不同场景的子注解例如:@Repository,@Service,@Controller等

BeanFactory

BeanFactory是Spring IOC的本质,他的存在解决了bean的生产于管理,并且Spring还将bean的各个生命周期阶段的管理接口暴露给我们,我们只需要实现这些接口那么在bean的生命周期阶段中,spring就会调用我们的接口实现去对bean做出相应处理。

Spring通过BeanDefinitionReader通过扫描我们项目中使用了@Component或者@Configuration注解的类,获取到BeanDefintiions,将他们注册到BeanFactory中。BeanFactory通过conCurrentHashMap存储bean的信息,key即为bean的名称,Value就是BeanDefintiions,BeanDefintiions就是Bean的一些元数据,比如类名、是否抽象等定义。

实现BeanFactory的实现类有多种,具体细节与取舍可以参考源码或者官方文档查看

总结

到这里我们其实对Spring IOC已经有了一个自己的理解,其实就是我们把类通过不同的方式注入到容器中,我们代码中只需要拿到这个bean然后去用就可以了,至于对象的生命周期都交给了我们的IOC容器去管理。

感谢各位大佬的光临,Spring IOC的细节有很多,每一个点都可以拿出来单独写一篇博客了,因此此篇博客以较为精简的介绍为主,想要探究更深层次的细节可以通过结合官方文档的介绍与源码去理解,好了不说废话了,再次感谢各位大佬能看到这里,如果该文章由任何问题欢迎各位大佬指出,谢谢

Spring框架之IOC介绍的更多相关文章

  1. Spring框架之IOC(控制反转)

    [TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...

  2. Spring框架中IoC(控制反转)的原理(转)

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  3. (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)

    Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1)  IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...

  4. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  5. Spring框架的IOC核心功能快速入门

    2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...

  6. Struts1、Struts2、Hibernate、Spring框架工作原理介绍

    Struts1工作原理 Struts1工作原理图 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控 ...

  7. Spring框架核心知识介绍

    一:spring框架介绍   1.spring框架是为了解决复杂的企业级应用而创建的, 使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情.但是Spring不仅仅局限于服务器 ...

  8. 初识Spring框架实现IOC和DI(依赖注入)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  9. Spring框架(2)---IOC装配Bean(xml配置方式)

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...

  10. 十七、Spring框架(IOC/DI)

    一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...

随机推荐

  1. 韦东山freeRTOS系列教程之【第五章】队列(queue)

    目录 系列教程总目录 概述 5.1 队列的特性 5.1.1 常规操作 5.1.2 传输数据的两种方法 5.1.3 队列的阻塞访问 5.2 队列函数 5.2.1 创建 5.2.2 复位 5.2.3 删除 ...

  2. Mybatis 总结ResultMap的复杂对象查询

    association:映射的是一个POJO类,处理一对一的关联关系 collection:映射的一个集合列表,处理的是一对多的关联关系 模版 <!--column不做限制,可以为任意表的字段, ...

  3. 分布式事务的概念和解决方案Seate

    引入分布式事务: 在电商系统中,扣减库存与保存订单是在两个服务中存在的,如果扣减库存后订单保存失败了是不会回滚的,这样就会造成数据不一致的情况,这其实就是我们所说的分布式事务的问题,接下来我们来学习分 ...

  4. Jenkins插件管理(Manager Plugins)【快速提升项目构建和部署实施的工作效率】

    Jenkins 是一个很棒的开源自动化平台.它有一些开箱即用的强大功能.然而,在我看来,让它脱颖而出的是它的社区和它开发的插件.有超过一千个插件可用于支持几乎所有用于构建.部署和自动化项目的技术.工具 ...

  5. Vue 数组和对象更新,但视图未更新,背后的故事

    在实际开发中,遇到遍历数组和对象,当property 发生改变时,并没有触发视图的更新今天来浅显的聊聊这背后的故事,有说的不对地方,还望指出! 本人博文地址:https://www.cnblogs.c ...

  6. AT_arc149_a 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 求满足以下条件的小于 \(10 ^ n\) 数最大是多少? 每一位数字均相同: 是 \ ...

  7. 兼容sentry协议的轻量级监控,glitchtip

    前言 上一篇文章说了重启 sentry 的事 因为过程太折腾了,一度想过放弃 sentry 换成其他比较轻量级的开源监控系统 这不就给我找到了另外俩个 https://glitchtip.com/ h ...

  8. [python] 启发式算法库scikit-opt使用指北

    scikit-opt是一个封装了多种启发式算法的Python代码库,可以用于解决优化问题.scikit-opt官方仓库见:scikit-opt,scikit-opt官网文档见:scikit-opt-d ...

  9. P5665 [CSP-S2019] 划分

    思路: 首先求出 \(a\) 的前缀和数组 \(s\). 考虑动态规划,令 \(dp_{i,j}\) 表示以 \(i\) 结尾,末尾有 \(j\) 个为一组的最小答案,则状态转移方程为: \[dp_{ ...

  10. 【Java】 Springboot+Vue 大文件断点续传

    同事在重构老系统的项目时用到了这种大文件上传 第一篇文章是简书的这个: https://www.jianshu.com/p/b59d7dee15a6 是夏大佬写的vue-uploader组件: htt ...