Spring IOC,DI原理保姆级带你了解如,让面试官感到你的魅力
一,什么是IOC
1.开始:Spring IoC容器的创建。
容器初始化:初始化IoC容器,包括加载配置文件、解析配置文件等。
加载XML/Java配置文件:从文件中加载Bean定义的配置信息。
解析配置文件:解析配置文件中的信息,创建对应的BeanDefinition对象。
创建BeanDefinition对象:根据配置文件的定义,创建一个对应的BeanDefinition对象。
2.注册Bean定义到IoC容器:
将BeanDefinition对象注册到IoC容器中,以便容器可以管理这些Bean。
3.解析依赖关系:
根据配置文件中的依赖关系,解析并创建相应的依赖关系。
实例化Bean:使用反射机制实例化每个Bean。
执行Bean的自定义初始化方法:在实例化后,执行Bean的自定义初始化方法(如init-method)。
4.填充Bean属性:
根据配置文件中的属性信息,为每个Bean设置属性值。
如果Bean实现了BeanNameAware接口,设置Bean名称:如果Bean实现了BeanNameAware接口,将为其设置一个唯一的名称。
如果Bean实现了BeanFactoryAware接口,注入BeanFactory实例:如果Bean实现了BeanFactoryAware接口,将为其注入一个BeanFactory实例,以便其可以访问容器中的其他Bean。
如果Bean实现了ApplicationContextAware接口,注入ApplicationContext实例:如果Bean实现了ApplicationContextAware接口,将为其注入一个ApplicationContext实例,以便其可以访问容器中的其他资源。
执行BeanPostProcessor的前置处理:在初始化前,通过BeanPostProcessor接口对每个Bean进行处理。
5.执行自定义的销毁方法:
在销毁时,执行Bean的自定义销毁方法(如destroy-method)。
6.将Bean实例保存到IoC容器中:
将每个已经初始化的Bean实例保存到IoC容器中,以便后续使用。
7.oC容器可以提供/注入Bean实例:
IoC容器可以提供或注入已经初始化的Bean实例给其他组件使用。
结束:完成整个流程。
二,什么是DI
1.Spring DI容器:
Spring提供的用于管理Bean的容器。它可以通过名称来获取或注入Bean实例。容器可以自动管理Bean的生命周期,包括实例化、初始化、使用和销毁等。
2.加载配置文件:
从文件系统中加载配置文件,如XML或Java配置文件。还可以通过其他方式加载配置文件,如通过注解或使用编程方式等。
3.解析配置文件:
解析配置文件中的信息,将其转换为内部的数据结构,以便后续的处理。解析器会根据配置文件的类型不同而有所不同,如XML配置文件使用XML解析器,Java配置文件使用Java解析器等。
4.创建BeanDefinition对象:
根据配置文件的定义,创建一个对应的BeanDefinition对象。每个Bean都由一个BeanDefinition对象表示。BeanDefinition对象包含了Bean的名称、类型、属性等信息。
5.注册Bean定义到容器:
将BeanDefinition对象注册到DI容器中,以便容器可以管理这些Bean。每个Bean定义都有一个唯一的名称,可以通过该名称来获取或注入Bean。容器还可以保存其他关于Bean的信息,如依赖关系、自定义方法等。
6.解析依赖关系:
根据配置文件中的依赖关系,解析并创建相应的依赖关系。这些依赖关系用于描述Bean之间的依赖关系,以便在实例化时注入依赖。解析器会根据依赖关系的类型不同而有所不同,如通过名称解析依赖关系或通过构造函数参数解析依赖关系等。
实例化Bean:使用反射机制实例化每个Bean。根据依赖关系,将需要的依赖注入到Bean中。在这个步骤中,容器会使用IoC的方式自动管理Bean的生命周期。容器还可以根据需要自动调用Bean的自定义方法等。
7.填充Bean属性:
根据配置文件中的属性信息,为每个Bean设置属性值。这些属性值可以通过配置文件或注解等方式进行设置。容器还可以根据需要自动设置属性值或调用自定义的属性填充方法等。
8.执行自定义初始化方法:
在实例化后,执行Bean的自定义初始化方法(如init-method)。这个方法可以在Bean初始化时执行一些自定义的逻辑。容器还可以根据需要自动调用自定义的初始化方法等。
9.执行自定义销毁方法:
在销毁时,执行Bean的自定义销毁方法(如destroy-method)。这个方法可以在Bean销毁时执行一些自定义的逻辑。容器还可以根据需要自动调用自定义的销毁方法等。
三,IOC和DI交互
1.增加了对配置文件类型的选择,包括XML配置文件、Java配置文件、注解配置文件和其他配置方式。这些配置文件用于定义Bean的属性和依赖关系。在加载配置文件后,解析器会解析配置文件,并将其转换为内部的数据结构,以便后续的处理。解析器会根据配置文件的类型不同而有所不同,如XML解析器用于解析XML配置文件,Java解析器用于解析Java配置文件等。解析器将解析后的信息注册到IoC容器中,以便容器可以管理这些Bean。容器会根据注册的Bean定义创建对应的Bean实例,并自动管理其生命周期。在实例化Bean后,容器会自动注入需要的依赖,并自动调用自定义的初始化方法和销毁方法等。最后,容器将Bean实例保存到容器中,以便后续使用。在需要使用Bean时,容器可以通过名称或其他方式获取Bean实例,并使用它们来完成各种任务。在使用Bean时,可以调用它们的各种方法,包括自定义的方法和注入的依赖等方法。
以下是关于Spring IOC和DI如何交互的流程图总结:
Spring IoC容器是用于管理Bean的容器,通过加载配置文件来注册Bean定义,并根据依赖关系实例化Bean,自动管理其生命周期。
配置文件用于定义Bean的属性和依赖关系,包括XML配置文件、Java配置文件、注解配置文件和其他配置方式。
在容器初始化时,会创建ApplicationContext对象,并加载BeanDefinition对象。ApplicationContext是IoC容器的高级接口,提供了更多的功能,如自动装配和自定义生命周期方法等。
在实例化Bean后,容器会自动注入需要的依赖,并自动调用自定义的初始化方法和销毁方法等。
容器将Bean实例保存到容器中,以便后续使用。在需要使用Bean时,可以通过容器获取Bean实例,并使用它们来完成各种任务。
通过流程图可以更详细地了解Spring IOC和DI如何交互的过程,包括加载配置文件、解析配置文件、创建BeanDefinition对象、注册Bean定义、解析依赖关系、实例化Bean、填充Bean属性、执行自定义初始化方法和销毁方法等步骤。
四,面试官一般会问讲讲什么ioc和di
IOC和DI是Spring框架中的重要概念,用于实现对象的解耦。IOC是一种设计思想,即控制反转。它的核心是将对象的创建和管理权利从应用程序代码中转移到一个容器或框架中。传统的开发方式是由应用程序代码直接控制和实例化对象,而控制反转则是由框架控制对象的创建、管理、组装和调用,应用程序代码只需通过接口或抽象类来间接使用对象,实现了对象的解耦。DI是IOC思想的具体实现方式之一,即依赖注入。它通过在对象创建时将对象所依赖的其他对象注入进来,实现了对象之间的松耦合。依赖注入的实现方式可以通过构造函数、setter方法或接口注入实现。通过依赖注入,对象不再负责创建或管理它所依赖的其他对象,而是通过IOC容器进行管理。因此,可以解释为IOC是一种设计思想,通过控制反转将对象的创建和管理权利交给框架,实现对象的解耦;而DI则是实现IOC思想的具体实现方式之一,通过依赖注入的方式实现对象之间的解耦。