Spring——IOC浅析

    科技2023-09-27  106

    IOC

    IOC(inverse of controll)控制反转(控制权反转),就是把创建对象(bean),和维护对象(bean)的关系和权力从程序中转移到spring的容器,而程序本身不再关心、维护对象创建和关系。

    IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

    DI(依赖注入)

    控制反转,或者叫DI(依赖注入)更加形象,DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中

    核心类

    Resource 以 Resource 接口为核心发散出的几个类,都是用于解决 IoC 容器中的内容从哪里来的问题,也就是 配置文件从哪里读取、配置文件如何读取 的问题。BeanDefinition BeanDefinition 指bean的定义信息,包括 Bean 的名字是什么、它的类型是什么,它的属性赋予了哪些值或者引用,也就是 如何在 IoC 容器中定义一个 Bean,使得 IoC 容器可以根据这个定义来生成实例 的问题。BeanFactory BeanFactory 接口定义了 IoC 容器在 已经获取 Bean 的定义的情况下,如何装配、获取 Bean 实例 的问题。ApplicationContext ApplicationContext 接口继承了BeanFactory 接口,基本上代替了BeanFactory的工作,以一种更面向框架的工作方式以及对上下文进行分层和实现继承,并在这个基础上对功能进行扩展: MessageSource, 提供国际化的消息访问资源访问(如URL和文件)事件传递Bean的自动装配各种不同应用层的Context实现

    BeanFactory和ApplicationContext区别

    如果使用ApplicationContext,如果配置的bean是singleton,那么不管你有没有或想不想用它,它都会被实例化。好处是可以预先加载,坏处是浪费内存。BeanFactory,当使用BeanFactory实例化对象时,配置的bean不会马上被实例化,而是等到你使用该bean的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。

    spring怎么实现的单例模式

    使用单例注册表缓存了单例对象,具体可以看org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean) 这里的实现

    protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return (singletonObject != NULL_OBJECT ? singletonObject : null); }

    使用的设计模式

    1、工厂模式 2、单例模式 3、策略模式 4、装饰器模式

    具体参见 Spring源码(七)-IOC中的那些设计模式

    一个简单实现

    GitHub上有人写了个简版练手容器实现如下。 参考github项目:https://github.com/code4craft/tiny-spring 说明文档:https://www.zybuluo.com/dugu9sword/note/382745

    参考资料

    谈谈对Spring IOC的理解

    Processed: 0.020, SQL: 8