当前位置: 首页 > 科技观察

16张图解开Spring的整体脉络

时间:2023-03-11 21:23:59 科技观察

今天我们来梳理一下Spring的整体脉络,为后面的文章做铺垫~对了,我们一直在用这个Spring,你觉得呢它?我还是不能说。呵呵,4ye的感觉就散了,印象中一直在用Springboot。我不需要配置一堆东西。管理依赖项非常方便。所以借此机会简单梳理一下上下文,这样看源码会更有条理,也能知道一些扩展点的使用等:stuck_out_tongue_closed_eyes:目录本文先简单介绍下这些知识点:point_down:印象深刻Spring脑子里有这么一个公式::point_right:IOC=factorymode+XML+reflection:point_right:而DI,AOP,transactions等用XML表达也很直观,虽然大部分我们现在改用这个注解,但是原理还是基本一样的:pig2:注解用起来很方便,但是如果要学习的话还是建议先过一遍这个XML。毕竟结构化文档有层次感,能给人留下更深的印象~:smile:小SpringSpring浓缩了,还有这么个小东西:pig2:想了想,还是用Spring吧,最重要的一点也就是用它来帮助我们管理和创建这个Bean。那么我们就从源头说起——Bean从哪里来(@_@;)Bean的解析过程如图所示,就是通过解析器解析我们的XML文件或者注解,最后将信息封装在BeanDefinition中class,并通过BeanDefinitionRegistry接口注册这些信息,放到beanDefinitionMap变量中,key:beanName,value:BeanDefinition简单看BeanDefinition中的属性BeanDefinitionbeanClass:bean类型,实例化时使用:pig2:scope:function作用域是单例,原型是Lazy:延迟加载,true会在getBean的时候生成,scope的原型是无效的,false会在Spring启动过程中直接生成initMethodName:初始化方法,当然初始化的时候会调用:pig2:primary:main,当有多个bean时,使用dependsOn:依赖bean,必须等待依赖bean创建完成后才能创建PS:@Component,@Bean,会被解析成BeanDefinition反射有了原材料之后,我们先来看看工厂BeanFactory简单想想这个工厂是怎么创建这个Bean的?没错,一定是这个反射:smile:然后结合我们从原材料中获取的重要属性之一的beanClass,我们可以画出这样一个图:point_down:那么我们再来看看这个BeanFactory:smile:BeanFactory先来看看BeanFactory提供了哪些方法作为IOC容器的根接口:类型匹配,包括Bean,简单看下它的子接口~:smile:这里分享一个小技巧:pig2:看源码的时候,一般直接看默认的接口,比如这里的DefaultListableBeanFactory,基本上就是看类名就知道大概的功能,然后先查个数:point_down:ListableBeanFactory:point_right:遍历beanHierarchicalBeanFactory:point_right:提供父子关系,可以得到上层的BeanFactoryConfigurableBeanFactory:point_right:实现了SingletonBeanRegistry,主要是单例bean的注册,生成了AutowireCapableBeanFactory:point_right:AbstractBeanFactory:point_right:自动组装相关的单例缓存,FactoryBean相关的ConfigurableListableBeanFactory:point_right:预实例化单例BeanDefinitionAbstractAutowireCapableBeanFactory的bean、分析、修改:point_right:创建Bean,属性注入,实例化,调用初始化方法等DefaultListableBeanFactory:point_right:支持单例Bean,Bean别名,父子BeanFactory,Beantype转换,Bean后处理,FactoryBean,自动组装等等,是不是很丰富:smile:FactoryBeanFactoryBean,本身就是一个Bean,是一个小工厂,由大工厂BeanFactory管理可以看出,获取对象的方法getObject()只有三个方法isSingleton()和单例对象getObjectType()返回Bean对象的类型。与大工厂BeanFactory相比,少了很多东西,也没有严格的Bean生命周期流程:point_right:《三分钟快速了解Spring中的工厂模式》文中介绍:微笑:FacotryBean对象本身也是一个Bean,小工厂可以produceotherBeansBeanFactory是Spring容器的根接口,是一个大工厂,生产各种BeanbeanNames是正常的对象“&”+beanName,获取实现该接口的FactoryBean工厂对象如下:point_down:ApplicationContext看看这个ApplicationContext,发现它扩展了很多功能。除了BeanFactory,它还可以创建和获取Bean。并处理国际化、事件、资源获取等Environment能够获取环境变量的功能,可以获取操作系统变量和JVM环境变量ListableBeanFactory获取所有BeanName,判断一个BeanName是否存在BeanDefinition对象,统计BeanDefinition对象,获取某类对应HierarchicalBeanFactory的所有beanName和其他函数获取父BeanFactory,判断某一个名字是否存在。bean对象的功能MessageSource国际化功能获取国际化资源ApplicationEventPublisher事件发布功能(key)ResourcePatternResolver加载获取资源功能,这里的资源可能是文件、图片等URL资源。有还有这三个重要的类:point_down:,先不一一介绍了:微笑:ClassPathXmlApplicationContextAnnotationConfigApplicationContextFileSystemXmlApplicationContext赶紧来看看这个核心吧!IOC容器当然这个时候会出现的一定是IOC我们都知道IOC是控制反转,但是别忘了容器这个词,比如容器的根接口**BeanFactory,容器的实现:point_down:ClassPathXmlApplicationContextAnnotationConfigApplicationContextFileSystemXmlApplicationContext同时,我们必须注意这里无处不在的后处理器xxxPostProcessor:pig:这就是Spring扩展性强的原因!我们可以在各个流程中合理的应用这些PostProcessors来扩展,或者修改Bean定义信息等,可以看到在这个容器中,Bean初始化完成,这个流程还有很多细节,请往下看:point_down:填写属性时DI会引入:pig:BeanFactoryPost-processor作为IOC容器根接口的BeanFactory,具有非常高的扩展性。Setprocessor:point_down:BeanDefinitionRegistryPostProcessor通过这个接口我们可以自己控制我们的原材料,通过BeanDefinitionRegistry接口增删改查获取我们的BeanDefinitionBeanFactoryPostProcessor通过这个接口我们可以在实例化对象之前修改和冻结BeanDefinition。预实例化的单例Bean经过上面几层的阻碍之后,我们最终会来到目标方法getBean,将原材料投入生产,最后一个一个的获取Bean对象,那么Bean的生命周期就会follow:smile:Bean生命周期Bean的创建和管理都有一个标准化的过程!这里在我们的工厂BeanFactory里写的很清楚:point_down:一共14步,是不是一下子就清楚了:smile:看这部分源码的时候多注意两个英文单词:stuck_out_tongue_closed_eyes:Instantiation:point_right:研究所Antiationinitialization:point_right:Initializationps:别看错了哈哈:stuck_out_tongue_closed_eyes:仔细看完上面14个步骤,你会发现前8个都是Aware接口,它们的功能也很简单,就是就是,获取单词xxAwarePrefixxx:smile:比如我们上面提到的事件发布者ApplicationEventPublisher:point_right:《三分钟快速上手Spring事件机制》,只要实现了ApplicationEventPublisherAware接口,就可以获取到事件发布者ApplicationEventPublisher!在Bean后处理器的实例化和初始化过程中,将Bean后处理器BeanPostProcessor排列在上面,会得到如下图:分BeanPostProcessor好了,下面重点说说这个AOPAOP。那么AOP是在哪一步代理对象呢?:point_down:可以在AbstractAutoProxyCreator类中看到:point_down:总结一下这篇文章,先介绍到这里:pig2:主要介绍Spring中的这些context,让小伙伴们先对它有一个整体的印象~再说介绍一下。一些扩展点,比如从源码的BeanFactoryPostprocessor,到产品Bean的BeanPostprocessor实例化,初始化的顺序,Bean的生命周期,BeanFactory和子类扩展的功能,再到功能应用程序上下文。还有这个核心机制:factory+XML+reflection,还有下面说的AOP发生的地方。