深入理解spring工作原理--总体概括

Spring是一个bean容器,管理对象生命周期和依赖关系。BeanFactory和ApplicationContext是核心容器,BeanDefinition描述bean属性。Spring通过加载配置文件创建容器,初始化bean并处理依赖注入,提供AOP和MVC功能。
摘要由CSDN通过智能技术生成

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
ApplicationContext实际上最终继承至BeanFactory,所以ApplicationContext也是beanFactory,但是要比beanFactory功能更强大

  1. HierarchicalBeanFactory:拥有获取父BeanFactory的功能
    获取父factoryBean
  2. ListableBeanFactory:拥有获取beanNames的功能
    获取beanName相关的功能
  3. ResourcePatternResolver:资源加载器,可以一次性获取多个资源(文件资源等等)
    获取资源文件功能
  4. EnvironmentCapable:可以获取运行时环境(没有设置运行时环境功能)
    获取运行时环境的功能
  5. ApplicationEventPublisher:拥有广播事件的功能(没有添加事件监听器的功能)
    事件广播功能
  6. MessageSource:拥有国际化功能
    国际化功能相关

其中,ApplicationContext有两个非常重要的实现类:

  1. AnnotationConfigApplicationContext
    可以简单理解成是注解类的bean工厂
  2. 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的工作流程可以分为以下几个步骤:

  1. 加载配置文件
    Spring框架首先读取配置文件,它可以是XML文件、Java注解或者Java代码。这些配置文件描述了Spring应用程序中的bean及它们之间的依赖关系。
  2. 创建容器
    Spring创建一个容器,它是Spring框架的核心,同时也是应用程序中所有bean的容器。Spring容器负责管理各种bean,包括创建、运行和销毁它们。Spring容器还提供了各种服务,例如依赖注入、AOP等。
  3. 初始化bean
    创建容器之后,Spring开始初始化所有被配置的bean,并将它们放入容器中。这个阶段包括实例化bean对象、设置bean的属性以及调用bean的初始化方法
  4. 依赖注入
    Spring注入bean之间的依赖关系,这是Spring的一个核心功能。它通过依赖注入(DI)来实现,可以使用构造函数注入、setter方法注入或者字段注入来实现。
  5. 使用bean
    当所有bean都被初始化并注入依赖项后,Spring容器就可以将这些bean提供给应用程序使用了。应用程序可以通过Spring容器获取一个bean,并调用它的方法
  6. 生命周期管理
    Spring容器管理bean的生命周期,包括初始化bean、运行bean、销毁bean等。当Spring容器关闭时,它会销毁所有被管理的bean。在bean销毁之前,Spring容器会调用它们的销毁方法,以便它们可以进行清理工作。

以上就是Spring的工作流程。通过这个流程,Spring实现了依赖注入和AOP等功能,简化了开发人员的工作,整体工作流程如下图:spring工作原理

4. 总结

Spring是一个开源的JavaEE框架,其核心功能是管理对象的生命周期和依赖关系。以下是Spring的工作原理的概述:

  1. Spring IOC容器:Spring的IOC容器是一个负责创建和管理对象的容器,在Spring中被称为Bean Factory。Bean Factory通过读取配置文件或注解,创建所需的对象并将它们保存在容器中,可以通过getBean()方法来获取对象实例。

  2. Bean:Spring中的Bean是指那些被IOC容器管理的对象,包括Java类的实例、数据源、事务管理器等。

  3. DI(Dependency Injection):DI是Spring的核心,它是一种处理对象依赖关系的方式,通过IOC容器将对象之间的依赖关系注入到对象中。通过DI,对象之间的关系可以被解耦,松耦合的对象更容易实现和测试。

  4. AOP(Aspect Oriented Programming):AOP是一种编程范式,用于处理系统中的横切关注点,例如日志记录、性能监控等。在Spring中,AOP通过代理模式实现,将横切关注点分离出来,并将其应用于整个系统中的多个对象。

  5. MVC(Model-View-Controller):Spring MVC是一种基于MVC的Web框架,它通过DispatcherServlet将请求分发给控制器,控制器处理请求并返回模型和视图。它通过请求映射、处理器映射、视图解析器等方式,提供了灵活的Web开发方式。

总之,Spring的工作原理是通过IOC容器管理Bean之间的依赖关系,通过DI实现对象之间的松耦合,通过AOP处理横切关注点,同时提供了一个MVC框架,用于构建Web应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值