Spring扩展原理

一、BeanFactoryPostProcessor

        是beanFactory后置处理器。在BeanFactory标准初始化之后调用,所有的bean定义已经保存加载到beanfactory,但是bean的实例还未创建。

        工作原理:通过invokeBeanFactoryPostProcessor(beanFactory)方法。

                1.在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法。

                2.在初始化创建其他组件前面执行。

二、BeanDefinitionRegistryPostProcessor

        是BeanFactoryPostProcessor的子接口;

        在所有bean定义信息将要加载,bean实例还未创建的时候;

        优先BeanFactoryPostProcessor执行;

        利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件;

        工作原理:

                1.在refresh()中调用invokeBeanFactoryPostProcessor(beanFactory)方法;

                2.从容器中获取所有的BeanDefinitionRegistryPostProcessor组件,

                        1)、依次触发所有postProcessorBeanDefinitionRegistry()方法;

                        2)、再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor;

        beanDefinitionRegistry 里面保存了每一个bean的定义信息。BeanFactory就是按照他的信息内容创建bean实例。优先于BeanFactoryPostProcessor执行。

三、ApplicationListener

        监听容器中发布的事件。完成事件驱动模型开发。

        步骤:1.写一个监听器来监听某个事件(ApplicationEvent及其子类)、或者使用@EventListener注解

                   2.把监听器加入到容器;

                   3.只要容器中有相关事件的发布,我们就能监听到这个事件。

                   4.发布一个事件:

                        applicationContext.publicEvent();

        【事件的发布流程】

                1.获取事件的多播器(派发器):getApplicationEventMulticaster()

                2.multicastEvent派发事件;

                3.获取到所有的ApplicationListener;判断是否支持Executor进行异步派发;

                        否则,同步的方式直接执行listener方法;invokeListener(listener,event);

                        拿到listener回调onApplicationEvent方法;

四、SmartInitializingSingleton

        1.ioc容器创建对象并refresh()

        2.finishBeanFactoryInitialization(beanFactory);

                1).先创建所有的单实例bean, getBean();

                2).获取所有创建好的单实例bean,判断是否是SmartInitilizingSingleton类型的;

                        如果是就调用afterSingletonsInstantiated();

五、Spring容器创建过程

        1.prepareRefresh() 刷新前的预处理

                1) initPropertySource() 初始化一些属性设置;子类自定义个性化的属性设置方法;

                2) getEnvironment().validateRequiredProperties();检验属性的合法等.

                3) earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>(); 保存容器中一些早期的事件;

        2.obtainFreshBeanFactory();获取BeanFactory;

                1) refreshBeanFactory(); 刷新【创建】BeanFactory;

                        创建了一个this.beanFactory = new DefaultListableBeanFactory();

                        设置id;                

                2) getBeanFactory(); 返回刚才GenericApplicationContext创建的BeanFactory对象;

                3) 将创建的BeanFactory【DefaultListableBeanFactory】返回;

        3. prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)

                1) 设置BeanFactory的类加载器、支持表达式解析器等

                2) 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】

                3) 设置忽略的自动装配的接口

                4) 注册可以解析自动装配的接口

                5) 添加BeanPostProcessor

                6) 添加编译时的AspectJ

                7) 给BeanFactory中注册一些能用的组件

                        environment、systemProperties、systemEnvironment

        4.postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;

                1) 子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置;

======================以上BeanFactory的创建及预准备工作=======================

        5.invokeBeanFactoryPostProcessors(beanFactory); 执行BeanFactoryPostProcessor;

                BeanFactoryPostProcessor: BeanFactory 的后置处理器,在BeanFactory标准初始化后执行的;

                两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor

                1) 执行BeanFactoryPostProcessor的方法,先判断是否实现 BeanDefinitionRegistry;

                        如果是,先执行BeanDefinitionRegistryPostProcessor;

                        1) 获取所有的BeanDefinitionRegistryPostProcessor;

                        2) 先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor;

                        3) 再执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor;

                        4) 最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessor

                2) 再执行BeanFactoryPostProcessor的方法

                        1) 获取所有的BeanFactoryPostProcessor

                        2) 先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor;

                        3) 再执行实现了Ordered顺序接口的BeanFactoryPostProcessor;

                        4) 最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor

        6.registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)【intercept bean creation】

                        1) 获取所有的BeanPostProcessor;后置处理器默认都可以通过PriorityOrdered、Ordered接口来执行优先级

                        2)先注册PriorityOrdered优先级接口的BeanPostProcessor

                                把每一个BeanPostProcessor添加到BeanFactory中

                        3)再注册Ordered接口的

                        4)最后注册没有实现任何优先级接口的

                        5)最终注册MergedBeanDefinitionPostProcessor

                        6)注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是就把ApplicationListener放在容器中:

        7.initMessageSource();初始化MessageSource组件(做国际化功能,消息绑定,消息解析);

                1) 获取BeanFactory

                2)看容器中是否有MessageSource组件,没有则自己创建一个。

                        MessageSource: 取出国际化配置文件中的某个key值,能按照区域信息获取;

                3)把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值时,可以自动注入MessageSource

        8.initApplicationEventMulticaster(); 初始化事件派发器

                1)获取BeanFactory

                2)从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster

                3)如果上一步没有配置,则获取一个SimpleApplicationEventMulticaster(beanFactory);简单的事件派发器

                4)将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入

        8.onRefresh();留给子类容器

                1) 子类重写这个方法,在容器刷新的时候可以自定义逻辑;

        9.registerListeners();给容器中将所有项目里面的ApplicationListener注册进来

                        1) 从容器中拿到所有的ApplicationListener

                        2) 将每个监听器添加到事件派发器中

                        3) 派发之前步骤产生的事件

        10.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例Bean

                1) beanFactory.preInstantiateSingletons(); 初始化剩下的单实例bean

                        1)获取容器中的所有Bean,依次进行初始化和创建对象。

                        2)获取Bean的定义信息;RootBeanDefinition

                        3)Bean不是抽象的,是单实例的,不是懒加载的

                                1)是否是FactoryBean:是否是实现FactoryBean接口的Bean

                                2)如果不是,用getBean创建对象。

                                        0、getBean(beanName);ico.getBean();

                                        1、doGetBean(name,null,null,false);

                                        2、先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)

                                        3、如果缓存拿不到,开始Bean的创建对象流程

                                        4、标记信息已被创建

                                        5、获取Bean的定义信息

                                        6、获取该Bean的依赖信息,如果有依赖,按照getBean()把依赖的Bean先创建出来。

                                        7、启动单实例的创建流程

                                                ①

                                                ②:【创建Bean实例】 调用createBeanInstance(beanName,mdb,args);方法,利用工厂方法或者对象的构造器创建出Bean实例;

                                                ③:【Bean属性赋值】populateBean;先拿到InstantiationAwareBeanPostProcessor后置处理器,依次调用postProcessAfterInstantiation()和postProcessPropertyValues()方法。最后调用applyPropertyValues()方法为属性赋值。

                                                ④:【Bean初始化】initializeBean();

                                                        调用初始化之前的后置处理器——》执行初始化方法(判断是否实现InitializingBean接口或者自定义初始化方法)——》执行初始化之后的后置处理器

                                                ⑤:注册Bean销毁方法

                                3)将创建的单实例Bean添加到缓存中singletonObjects;(是一个Map,IOC容器是很多的Map)

总结

        1.Spring容器再启动的时候,先回保存所有注册进来的Bean的定义信息;

                1)、xml注册Bean

                2)、注解注册Bean

        2.Spring容器会合适的时机创建这些Bean

                1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中。

                2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization()

        3.后置处理器;

                1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能。

                        AutowiredAnnotationBeanPostProcessor:处理自动注入

                        AnnotationAwareAspectJAutoProxyCreator:来做AOP功能

        4.事件驱动模型:

                ApplicationListener:事件监听

                ApplicationEventMulticaster; 事件派发

                                        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring是一个开源的Java应用框架,它的核心原理是基于控制反转(Inversion of Control,IoC)和面向切面编程(Aspect-Oriented Programming,AOP)。 控制反转指的是将对象的创建、依赖注入和管理的责任由程序员转移到了Spring容器中。在传统的开发中,对象的创建和依赖关系的维护通常由程序员手动进行,而在Spring中,这些工作都由Spring容器负责。Spring容器通过配置文件或注解来管理对象的生命周期和依赖关系,程序员只需要定义好对象和它们的依赖关系,就可以从容器中获取到所需的对象。 面向切面编程是一种编程范式,它允许开发者在不改变原有代码逻辑的情况下,通过将横切逻辑(如日志记录、性能监控等)独立地插入到应用程序中。Spring通过AOP模块来实现面向切面编程,它可以通过配置或注解方式来定义切面,然后在需要增加横切逻辑的地方将切面织入到目标对象中。 除了IoC和AOP,Spring还提供了其他一些重要的特性,如事务管理、数据访问、Web开发等。它通过各种模块的集成和扩展来满足不同应用场景的需求。 总之,Spring的核心原理是基于控制反转和面向切面编程,通过Spring容器和AOP模块来实现对象的生命周期管理、依赖注入和横切逻辑的插入。这使得开发者可以更加关注业务逻辑的实现,而无需过多关注底层的框架细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值