搜索
简帛阁>技术文章>Spring IOC的实现原理理解

Spring IOC的实现原理理解

  1. 由于对象之间存在了复杂的依赖关系,导致耦合度较高,为了解决这个问题,所以提出了ioc原理
  2. ioc(控制反转)是什么
    其实简单来说就是你在创建对象的时候不用自己去new 一个对象,而是有别的给你提供,在spring 中就有ioc容器给你提供对象。
  3. ioc在spring中怎么实现
    我个人觉得spring中的ioc实现其实就是加强版的工厂模式,然后它通过加载配置文件来初始化对象。在这里配置文件可以用xml , properties等都可以,但是不同的配置文件类型需要用不同的解析器去解读。
    然后 Spring Bean的创建的使用工厂模式,这里有一系列的Bean工厂。BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范。
public interface BeanFactory {    
     
     //对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,    
     //如果需要得到工厂本身,需要转义           
     String FACTORY_BEAN_PREFIX = "&"; 
        
     //根据bean的名字,获取在IOC容器中得到bean实例    
     Object getBean(String name) throws BeansException;    
   
    //根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。    
     Object getBean(String name, Class requiredType) throws BeansException;    
    
    //提供对bean的检索,看看是否在IOC容器有这个名字的bean    
     boolean containsBean(String name);    
    
    //根据bean名字得到bean实例,并同时判断这个bean是不是单例    
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;    
    
    //得到bean实例的Class类型    
    Class getType(String name) throws NoSuchBeanDefinitionException;    
    
    //得到bean的别名,如果根据别名检索,那么其原名也会被检索出来    
   String[] getAliases(String name);    
    
 }

在BeanFactory里只对IOC容器的基本行为作了定义,根本不关心你的bean是如何定义怎样加载的。正如我们只关心工厂里得到什么的产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。
而要知道工厂是如何产生对象的,我们需要看具体的IOC容器实现,spring提供了许多IOC容器的实现。比如XmlBeanFactory,ClasspathXmlApplicationContext等。其中XmlBeanFactory就是针对最基本的ioc容器的实现,这个IOC容器可以读取XML文件定义的BeanDefinition(XML文件中对bean的描述)。
ApplicationContext是Spring提供的一个高级的IoC容器

IOC容器初始化过程:

初始化的入口在容器实现中的 refresh()调用来完成
对 bean 定义载入 IOC 容器使用的方法是 loadBeanDefinition,其中的大致过程如下:通过 ResourceLoader 来完成资源文件位置的定位,DefaultResourceLoader 是默认的实现,同时上下文本身就给出了 ResourceLoader 的实现,可以从类路径,文件系统, URL 等方式来定为资源位置。如果是 XmlBeanFactory作为IOC 容器,那么需要为它指定 bean 定义的资源,也就是说 bean 定义文件时通过抽象成 Resource 来被 IOC容器处理的,容器通过 BeanDefinitionReader来完成定义信息的解析和 Bean 信息的注册,往往使用的是XmlBeanDefinitionReader 来解析 bean 的 xml 定义文件 - 实际的处理过程是委托给BeanDefinitionParserDelegate 来完成的,从而得到 bean 的定义信息,这些信息在 Spring 中使用BeanDefinition 对象来表示 - 这个名字可以让我们想到loadBeanDefinition,RegisterBeanDefinition 这些相关的方法 -他们都是为处理 BeanDefinitin 服务的, 容器解析得到 BeanDefinitionIoC 以后,需要把它在 IOC 容器中注册,这由 IOC 实现 BeanDefinitionRegistry 接口来实现。注册过程就是在 IOC容器内部维护的一个HashMap 来保存得到的 BeanDefinition 的过程。这个 HashMap 是 IoC 容器持有 bean 信息的场所,以后对 bean 的操作都是围绕这个HashMap 来实现的.
然后我们就可以通过 BeanFactory 和 ApplicationContext 来享受到 Spring IOC 的服务了,在使用 IOC 容器的时候,我们注意到除了少量粘合代码,绝大多数以正确 IoC风格编写的应用程序代码完全不用关心如何到达工厂,因为容器将把这些对象与容器管理的其他对象钩在一起。基本的策略是把工厂放到已知的地方,最好是放在对预期使用的上下文有意义的地方,以及代码将实际需要访问工厂的地方。 Spring 本身提供了对声明式载入 web 应用程序用法的应用程序上下文,并将其存储在ServletContext中的框架实现。

IOC容器的依赖注入
当Spring IoC容器完成了Bean定义资源的定位、载入和解析注册以后,IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况发生:
(1).用户第一次通过getBean方法向IoC容索要Bean时,IoC容器触发依赖注入。
(2).当用户在Bean定义资源中为元素配置了lazy-init属性,即让容器在解析注册Bean定义时进行预实例化,触发依赖注入。

Spring IoC容器是如何将属性的值注入到Bean实例对象中去的:

(1).对于集合类型的属性,将其属性值解析为目标类型的集合后直接赋值给属性。
(2).对于非集合类型的属性,大量使用了JDK的反射和内省机制,通过属性的getter方法(readermethod)获取指定属性注入以前的值,同时调用属性的setter方法(writer method)为属性设置注入后的值

参考来源: https://www.cnblogs.com/lqmblog/p/8592817.html

总体到局部总控制反转:理论思想,原来对象是由使用者来进行控制,有了spring之后,可以把整个对象交给spring来帮我们进行管理DI(依赖注入):把对应属性值注入到具体对象中,@Autow
控制反转IOCSpring通过一种称作控制反转技术来更好实现低耦合。那么什么是控制反转呢?在了解控制反转之前我们先要了解IOC容器怎么管理对象,通常我们直接在对象内部通过new进行对象创建,是
IOC:控制反转(inversionofcontrol)主要有两种实现:DL和DISpringIOC使用是DI(依赖注入)主要涉及两个容器:低级容器:BeanFactory,就是个HashMap,
IoC理论背景我们都知道,在采用面向对象方法设计软件系统中,它底层实现都是由N个对象组成,所有的对象通过彼此合作,最终实现系统业务逻辑。图1:软件系统中耦合对象如果我们打开机械式手表
目录1IOC理论背景2什么是控制反转(IoC)3IOC别名:依赖注入(DI)4IOC为我们带来了什么好处5IOC容器技术剖析6IOC容器一些产品7使用IOC框架应该注意什么1IOC理论背景我
Spring容器高层视图Spring启动时读取应用程序提供Bean配置信息,并在Spring容器中生成一份相应Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间依赖关系,为
什么是控制反转?控制反转是一种将组件依赖关系创建和管理置于程序外部技术。由容器控制程序之间关系,而不是由代码直接控制由于控制权由代码转向了容器,所以称为反转依赖注入,作用是避免手工在各代码中ne
IOC推导11、模拟一个正常查询信息业务流程:①mapper层:因为没有连接数据库,这里我们写一个mapper实现类来模拟数据查询publicinterfacePerMapper{voidg
一、IOC控制反转和DI依赖注入1控制反转,字面可以理解为:主动权转移,原来一个应用程序内对象是类通过new去主动创建并实例化,对对像创建主动权在程序代码中。程序不仅要管理业务逻辑也要管理对
spring框架优点是一个轻量级笔记简单易学框架,实际使用中的有点优点有哪些呢!1降低了组件之间耦合性,实现了软件各层之间解耦2可以使用容易提供众多服务,如事务管理,消息服务等3容器提供单