zoukankan      html  css  js  c++  java
  • Spring 源码学习 02:关于 Spring IoC 和 Bean 的概念

    前言

    在前一篇文章中介绍了如何构建源码阅读环境,既然构建好了源码环境,本地也可以正常运行,那就开始阅读源码吧!

    在阅读源码时,会参考官方文档,很多概念在官网都可以得到答案,有兴趣的小伙伴们可以继续阅读,当做复习,写的不足之处,希望多多指导。

    IoC 和 DI

    IoC 概念

    IoC

    IoC(Inversion of Control),即控制反转。

    之前是在对象内部 new 创建其他对象,然后使用。

    而现在 Spring 中有一个容器可以在创建管理这些对象,并且将对象依赖的其他对象注入到这个对象中,这些对象的创建、销毁都由 Spring 进行管理。

    相比以前来说,不再由自己控制其他对象的生命周期,这个过程就叫做控制反转。而负责统一管理这些类的容器就叫做 IoC 容器。

    DI

    IoC is also known as dependency injection (DI).

    是不是感觉奇奇怪怪的,为什么说:IoC 也称为 DI

    其实 IoC 和 DI 是同一个概念的不同角度描述。

    依赖注入是指组件之间的依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。

    通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

    Spring 是通过 DI 实现 IoC 的。

    Container 和 Bean

    Spring IoC container and Bean

    Bean 是一个由 Spring IoC 容器实例化,组装和管理的对象。

    相信大家都写过或者见过下面的代码:

    /**
     * 从容器中获取对象
     * @author liuzhihang
     * @date 2020/4/6 19:02
     */
    @Component
    public class CustomBeanFactory implements ApplicationContextAware {
    
        private static ApplicationContext ctx;
    
        @Override
        public void setApplicationContext(ApplicationContext ac) throws BeansException {
    
            ctx = ac;
        }
    
        public static Object getBean(String beanName) {
    
            return ctx.getBean(beanName);
        }
    }
    

    代码逻辑很简单,就是从容器中获取到指定名称的 Bean,而其中 ApplicationContext 接口其实就是 Spring IoC 容器。

    当然 ApplicationContext 是一个接口,它有很多实现,而它也继承了 BeanFactory

    BeanFactory or ApplicationContext

    虽然 BeanFactory 是 IoC 容器的最基本的形式,但是 ApplicationContext 对其进行了很多扩展,并具有 BeanFactory 的所有功能,通常建议优先使用 ApplicationContext

    总结

    在通过Spring 官网 了解了 IoC 、DI 、容器和 Bean 的概念后,再结合平常的使用基本上可以有个大概流程。

    流程猜想

    当然,这只是一个很粗略的猜想,是否正确,还有待后面继续阅读源码,然后去验证。

    相关推荐

    作者: 刘志航

    公众号:『 程序员小航 』

    版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Notes

  • 相关阅读:
    linux添加超级用户
    MongDB配置方法
    【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp
    【bzoj3560】DZY Loves Math V 欧拉函数
    【bzoj5157】[Tjoi2014]上升子序列 树状数组
    【uoj#317】[NOI2017]游戏 2-SAT
    【bzoj5146】有趣的概率 微积分
    【bzoj4695】最假女选手 线段树区间最值操作
    【bzoj4355】Play with sequence 线段树区间最值操作
    【loj2319】[NOIP2017]列队 Splay(卡过)
  • 原文地址:https://www.cnblogs.com/liuzhihang/p/source-spring-02.html
Copyright © 2011-2022 走看看