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. 一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案

    前言 今天大姚给大家分享一款EF Core下高性能.轻量级针对分表分库读写分离的解决方案,开源(Apache License)的EF Core拓展程序包:ShardingCore. ShardingC ...

  2. MQTT协议介绍与Broker列表

    MQTT协议介绍 MQTT是什么? MQTT 是基于 Publish/Subscribe(发布/订阅) 模式的物联网通信协议,凭借简单易实现.支持 QoS.报文小等特点. 官网:https://mqt ...

  3. yb课堂 前端项目技术组件概述 《三十》

    常用的技术组件的作用 学前必备基础:HTML.CSS.JavaScript.Vue基础知识 Vue:用于构建用户界面的渐进式JavaScript框架 什么是Cube-UI 基于Vue.js实现的精致移 ...

  4. 新版SpringBoot-Spring-Mybatis 数据库相关配置

    application.properties server.port=8081 # ========================数据库相关配置===================== sprin ...

  5. cf edu 133 D

    题意 思路 根据题意,最开始可以想到一个二维的dp状态 用dp[i][j]表示跳了j次刚好到i的方案数 如果是跳了j次,那么这次应该要被k+j-1整除才行 那么这样状态转移就是 dp[i][j] = ...

  6. 四 黑马程序员-java面向对象(上)

    一.:面向对象 (1)面向对象:是基于面向过程的一种思想. 面向过程:以函数为基础,关注实现过程. 面向对象:以对象为基础,关注实现结果. (2)面向对象的思想特点: A:是一种更符合人们思考习惯的思 ...

  7. [oeasy]python0003_ 终端大冒险_终端命令_whoami_pwd_ls

    终端大冒险_终端命令_ls_pwd_whoami 回忆 上次 了解基本环境 简称 含义 CLI 命令行界面 GUI 图形用户界面 在 CLI 中 通过终端 连接 远程服务器的 壳(shell) 控制 ...

  8. [oeasy]python0014_二进制_binary_bin

    ​ 二进制(binary) 回忆上次内容 上次我们了解了​​ASCII​​码表 ​ASCII​​ 码表就是 ​​A​​merican ​​S​​tandard ​​C​​ode for ​​I​​nf ...

  9. [rCore学习笔记 07]移除标准库依赖

    改造Rust hello world 移除println!宏 rustc添加对裸机的支持 rustup target add riscv64gc-unknown-none-elf detail rus ...

  10. OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024

    随着预训练视觉模型的兴起,目前流行的视觉微调方法是完全微调.由于微调只专注于拟合下游训练集,因此存在知识遗忘的问题.论文提出了基于权值回滚的微调方法OLOR(One step Learning, On ...