写点什么

Spring 框架之 IOC 介绍

  • 2024-09-03
    福建
  • 本文字数:1759 字

    阅读完需:约 6 分钟

简介


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


文章转载自:交给时间

原文链接:https://www.cnblogs.com/zyyjgsj/p/18392882

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Spring框架之IOC介绍_spring_快乐非自愿限量之名_InfoQ写作社区