spring总体工作原理
1. 介绍
spring实际上是一个bean容器,它负责整个bean生命周期的管理,包括创建、初始化、销毁等。那么在spring中是如何创建一个对象的呢?按照个人理解,实际上是先初始化bean工厂,然后通过bean工厂生产制造bean,最后将bean缓存起来,用的时候根据beanName获取bean,容器销毁,bean也消失。以前我们需要使用一个对象,必须先new出来,但是在spring中,对象的创建、依赖关系、初始化、销毁等都由spring管理。
2. 核心概念
2.1 BeanFactory
spring的核心容器,定义了容器最基本的最基本的功能,包括获取bean(getBean())、判断是否包含bean、判断是不是单例bean、获取bean的Clazz等
2.2 ApplicationContext
ApplicationContext实际上最终继承至BeanFactory,所以ApplicationContext也是beanFactory,但是要比beanFactory功能更强大
- HierarchicalBeanFactory:拥有获取父BeanFactory的功能
- ListableBeanFactory:拥有获取beanNames的功能
- ResourcePatternResolver:资源加载器,可以一次性获取多个资源(文件资源等等)
- EnvironmentCapable:可以获取运行时环境(没有设置运行时环境功能)
- ApplicationEventPublisher:拥有广播事件的功能(没有添加事件监听器的功能)
- MessageSource:拥有国际化功能
其中,ApplicationContext有两个非常重要的实现类:
- AnnotationConfigApplicationContext
可以简单理解成是注解类的bean工厂 - ClassPathXmlApplicationContext
xml的bean工厂
2.3 BeanDefinition
标识对bean的描述,也叫bean的定义,里面有很多属性来描述一个bean:
- beanName:bean的名字
- class:bean的class对象
- scope:bean的作用域,是单例的还是原型(默认是单例)
- initMethodName:bean初始化执行的方法
- destryMethod:销毁时执行的方法等
- …等等
在spring中可以通过注解的方式定义一个bean(@Bean @Component @Service @Controller ),也可以通过xml配置文件定义bean,这两种叫做申明式定义bean;还可以通过代码直接生成bean:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
context.registerBeanDefinition("user", beanDefinition);
System.out.println(context.getBean("user"));
通过代码的方式生成bean叫做编程式定义,不管是申明式还是编程式最后都会被spring解析成一个个的BeanDefinition放入spring的容器中(BeanDefinitionMap)
2.4 BeanDefinitionMap
spring容器中用来存BeanDefinition的容器,其本质上是一个map,key是beanName,value是BeanDefinition。在spring当中,会有多个BeanDefinitionMap(三级缓存)
2.5 BeanFactoryPostProcessor
bean工厂的后置处理器,在bean初始化之前执行,ioc解析完beanDefinition之后执行,可以干扰bean的创建。
2.6 BeanPostProcessor
bean的后置处理器,可以用来在bean初始化之前以及初始化之后去额外的做一些用户自定义的逻辑,当然,我们可以通过判断beanName来进行针对性处理(针对某个Bean,或某部分Bean)。
3. 流程
Spring的工作流程可以分为以下几个步骤:
- 加载配置文件
Spring框架首先读取配置文件,它可以是XML文件、Java注解或者Java代码。这些配置文件描述了Spring应用程序中的bean及它们之间的依赖关系。 - 创建容器
Spring创建一个容器,它是Spring框架的核心,同时也是应用程序中所有bean的容器。Spring容器负责管理各种bean,包括创建、运行和销毁它们。Spring容器还提供了各种服务,例如依赖注入、AOP等。 - 初始化bean
创建容器之后,Spring开始初始化所有被配置的bean,并将它们放入容器中。这个阶段包括实例化bean对象、设置bean的属性以及调用bean的初始化方法 - 依赖注入
Spring注入bean之间的依赖关系,这是Spring的一个核心功能。它通过依赖注入(DI)来实现,可以使用构造函数注入、setter方法注入或者字段注入来实现。 - 使用bean
当所有bean都被初始化并注入依赖项后,Spring容器就可以将这些bean提供给应用程序使用了。应用程序可以通过Spring容器获取一个bean,并调用它的方法 - 生命周期管理
Spring容器管理bean的生命周期,包括初始化bean、运行bean、销毁bean等。当Spring容器关闭时,它会销毁所有被管理的bean。在bean销毁之前,Spring容器会调用它们的销毁方法,以便它们可以进行清理工作。
以上就是Spring的工作流程。通过这个流程,Spring实现了依赖注入和AOP等功能,简化了开发人员的工作,整体工作流程如下图:
4. 总结
Spring是一个开源的JavaEE框架,其核心功能是管理对象的生命周期和依赖关系。以下是Spring的工作原理的概述:
-
Spring IOC容器:Spring的IOC容器是一个负责创建和管理对象的容器,在Spring中被称为Bean Factory。Bean Factory通过读取配置文件或注解,创建所需的对象并将它们保存在容器中,可以通过getBean()方法来获取对象实例。
-
Bean:Spring中的Bean是指那些被IOC容器管理的对象,包括Java类的实例、数据源、事务管理器等。
-
DI(Dependency Injection):DI是Spring的核心,它是一种处理对象依赖关系的方式,通过IOC容器将对象之间的依赖关系注入到对象中。通过DI,对象之间的关系可以被解耦,松耦合的对象更容易实现和测试。
-
AOP(Aspect Oriented Programming):AOP是一种编程范式,用于处理系统中的横切关注点,例如日志记录、性能监控等。在Spring中,AOP通过代理模式实现,将横切关注点分离出来,并将其应用于整个系统中的多个对象。
-
MVC(Model-View-Controller):Spring MVC是一种基于MVC的Web框架,它通过DispatcherServlet将请求分发给控制器,控制器处理请求并返回模型和视图。它通过请求映射、处理器映射、视图解析器等方式,提供了灵活的Web开发方式。
总之,Spring的工作原理是通过IOC容器管理Bean之间的依赖关系,通过DI实现对象之间的松耦合,通过AOP处理横切关注点,同时提供了一个MVC框架,用于构建Web应用程序。