前言:Spring IoC(控制反转)是Spring框架的核心管理容器,它负责管理应用中所有组件(对象)的生命周期和依赖关系。通过将需要实例化和管理的组件通过配置文件或注解标注,Spring容器自动完成对象的创建、组装和管理等各种工作
本文主要涉及到 组件,容器,配置文件,依赖注入等内容。
1.组件
平常我们实例化一个类,对象时,需要通过new方式去实例化,而实例化时,会自动触发这个类的构造函数,当程序结束或者该类没有用处时候,我们将手动或者程序自动结束该类的生命进程。
在Spring中,我们称这种具有创建、运行、销毁完整生命周期的对象为组件(也称Bean)。与传统方式不同的是,组件的生命周期由Spring容器全权管理:
-
实例化:由容器根据配置创建对象实例
-
组装:自动注入所依赖的其他组件
-
管理:负责对象的生命周期,包括初始化和销毁
组件不仅仅是普通的Java对象,还是被Spring容器托管的对象,保证了组件之间的解耦和灵活协作。。
2.容器
在Java中,ArrayList
、Set
等是用来存储对象的容器,它们负责对象的存储和访问。
比如Integer,String或者自定义的对象,类等等。
Spring里面呢有它 自己的容器,即Spring IOC容器,Spring IOC容器负责自动的去创建,保存,组装,管理组件对象。
Spring IoC容器是实现控制反转(IoC)和依赖注入(DI)的核心,容器通过读取配置元数据,动态地创建和装配组件对象。
Spring中最常用的容器接口有:
-
BeanFactory:最基础的容器接口,负责Bean的实例化和管理
-
ApplicationContext:是BeanFactory的子接口,功能更强大,支持国际化、事件发布等,适合企业级应用
3.配置文件
首先,我们刚刚提到了,Spring容器负责自动的去创建,保存,组装,管理组件对象。
怎么个创建方法?怎么个组装 管理方法?如果你不给任何提示,SpringIOC容器可以自动的,在你写完多个对象,多个类的时候直接的帮你进行各种实例化,各种考虑的东西吗?
显然是不可以的,这是时候我们需要对Spring IOC进行解释。写一种它能够读懂的方式。
Spring IOC怎么才能读懂,我们需要创建什么呢?
这时候就要有配置文件了。
配置文件总共有三种 XML类型文件的注释 JAVA配置类 注释 以及通过注解配置对每个组件里面的内容进行注释。
-
XML配置:通过XML文件定义Bean及其依赖关系,是Spring最早也是最传统的配置方式。
-
注解配置:通过Java类上的注解(如
@Component
、@Service
、@Autowired
等)标注组件和依赖,容器通过扫描自动装配。 -
Java配置类:使用
@Configuration
和@Bean
注解的Java类来替代XML配置,增强类型安全和灵活性。
配置文件写完之后呢,机器就可以识别,同时将需要实例化的东西自动的去实例化。
也就是。
4.依赖注入
我们平常实例化对象是怎么实例化的?通过new方式
而Spring IOC容器主要通过构造函数注入,Setter方法注入两种方式进行实例化,具体选哪种呢?需要看你配置文件是怎么配置怎么注释的了,你怎么配置的,怎么注释的。SpringIOC容器就会怎么去做。
而你写完注入的配置文件了,去实例化了,这时候就要涉及依赖注入了。
当你配置文件是实例化对象A时,如果A依赖于对象B 对象C
那么这时候Spring容器将自动的去找到对象B与对象C,通过反射,去使用构造函数以及setter函数将这两个依赖注入进A
这就是依赖注入。
5.Spring IOC工作流程简述
-
编写配置元数据(XML、注解、Java配置类)
-
容器启动,加载配置
-
容器实例化Bean,通过反射调用构造函数或工厂方法创建组件实例
-
依赖注入,所有的组件实例化之后,我们再将所需依赖通过Setter或构造器注入组件中
-
组件初始化,调用初始化方法(注意顺序,是所有的组件进行实例化了,所有的组件进行依赖注入以后我们才对组件进行了初始化,也就是说,组件编写的先后顺序对组件的初始化是没关系的。比如组件A初始化时需要用到组件B。我们可以把组件A写在组件B的前面,这是没有关系的)
-
组件使用,应用程序通过容器获取组件实例,进行各种操作
-
容器关闭时销毁组件,调用销毁方法对组件进行销毁,关闭等操作