栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring底层原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring底层原理

ApplicationContext过程
1.准备刷新的上下文环境。
2.初始化BeanFactory,并进行XML文件读取:
        1)创建DefaultListableBeanFactory。
        2)指定序列化id。
        3)定制beanFactory,设置相关属性。
        4)初始化documentReader,并进行XML文件读取与解析:
                1_为指定的beanFactory创建XmlBeanDefinitionReader。
                2_对xmlBeanDefinitionReader进行环境变量的设置。
                3_使用XmlBeanDefinitionReader的LoadBeanDefinition方法进行配置文件的解析加载及注册。
        5)使用全局变量记录BeanFactory类实例。
3.对BeanFactory进行各种功能填充:
        1)增加对SpEL语言的支持。
        2)增加对属性编辑器的支持。
        3)添加BeanPostProcessor (ApplicationContextAwareProcessor)。
        4)设置依赖功能可忽略的接口。
        5)注册一些固定依赖的属性。
        6)增加对AspectJ的支持。
        7)将相关环境变量及属性注册以单例模式注册。
4.postProcessBeanFactory(beanFactory): ——此方法是预留给子类重写,以实现额外的处理。
5.激活各种BeanFactory处理器。
6.注册拦截Bean创建的BeanPostProcessor:
        ——BeanFactory中没有实现后处理器的自动注册,调用的时候需要手动注册。而现在ApplicationContext实现了自动注册的功能。
        ——这里只是注册,没有调用。
7.初始化MessageSource,国际化处理。
8.初始化应用消息广播器。
。。。
Bean加载的过程
getBean()。
1.转换对应的beanName:
        去除修饰符,如FactoryBean,&aa 变为 aa。如果bean是一个FactoryBean,则
        如果使用的是别名,则返回其最终的beanName

2-1先从缓存中加载单例:
        ——因为在创建单例bean的时候,如果有依赖的话,可能会出现循环依赖的问题。为了避免这个问题,在创建bean的时候不等创建完成就会将创建的bean的ObjectFactory放到缓存中。
        1)首先尝试从singletonObjects里面获取实例,里面维护了beanName和bean实例的关系。
        2)如果没获取到,从earlySingletonObjects里面获取。
        3)还获取不到,则尝试从singletonFactories里取,里面维护了beanName与创建bean的工厂之间的关系,然后将拿到的ObjectFactory放到earlySingletonObjects里面去,并将singletonObjects中的ObjectFactory去除掉。
2-2如果没有从缓存中拿到:
        。。。
        创建bean:——返回的是ObjectFactory对象
                根据设置的class属性或者根据className来解析Class。
                对override属性进行标记及验证。
                应用初始化前的后处理器:
                        ——调用postProcessBeforeInstantiation()方法,bean可能已经是一个代理生成的bean了。
                        ——调用postProcessAfterInitialization()方法,因为Spring会尽力保证所有bean初始化后都会调用这个后处理器的方法。
                创建bean,如果上面返回的bean不是null,则不会走这一步:
                        1_如果是单例需要首先清除缓存
                        2_实例化bean,将BeanDefinition转换为BeanWrapper
                        3_应用MergedBeanDefinitionPostProcessor。
                        4_防止循环依赖,在bean初始化完成前将创建实例的ObjectFactory加入工厂。
                        5_属性填充。
                        6_初始化。
                                在调用初始化方法前后会调用后处理的方法。
                                如果该bean是InitializingBean,则需要调用afterPropertiesSet()方法。
                                如果定义了init-method,则会执行该方法。
                        7_循环依赖检查,抛出异常。
                        8_注册DisposableBean
                        9_完成创建并返回。
        首先判断singletonObjects缓存里面有没有。如果有,则直接返回了。
        没有加载,则将beanName记录为记载状态,放到singletonsCurrentlyInCreation里。
        调用ObjectFactory的getObject方法实例化bean。
        加载单例后,移除缓存中bean的正在加载状态的记录。
        将结果记录至缓存并删除加载bean过程中所记录的各种辅助状态。
        
3.从bean的实例中获取对象:
        1)对FactoryBean正确性验证。
        2)对非FactoryBean的不做任何处理。
        3)将bean进行转换,转换成FactoryBean的对象。
        3)从FactoryBean中解析bean
                   里面获取bean是调用了getObject方法,返回创建的实例。所以继承自FactoryBean的bean获取实例都是创建实例而不是本身
                   调用了后处理器,Spring会尽可能保证所有bean初始化后都会调用注册的BeanPostProcessor的postProcessAfterInitialization()方法。         
4.原型模式的依赖检查
5.检测parentBeanFactory
6.将存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition
7.寻找依赖
8.针对不同的scope进行bean的创建
9.类型转换
Spring AOP
前面讲到Spring尽量为每个bean都实现调用postProcessAfterInitialization()方法,在这个方法中,Aop就在wrapIfNecessary()这个方法中展开。

1.获取增强方法或者增强器
        1)获取所有的beanName,所有在beanFactory中注册的bean都会被提取出来。
        2)遍历所有beanName,并找出声明AspectJ注解的类,进一步处理。
        3)对标记为AspectJ注解的类进行增强器的提取。
                1_切点信息的获取,只获取Before.class,Around.class,After.class,AfterReturning.class,AfterThrowing.class,PointCut.class这六种注解,提取表达式信息。
                2_根据切点信息生成增强。因为不同注解类型需要增强的位置不同,需要不同的增强器来增强。
        4)将提取结果加入缓存。
        5)前面完成所有增强器的解析,但对于所有增强器来说不一定都是用于当前bean,还要挑选出适合的增强器:
                ——通过PointCut注解来寻找
2.根据获取的增强进行代理
        1)获取当前类中的属性。
        2)添加代理接口。
        3)封装Advisor并加入到ProxyFactory中。
        4)设置要代理的类。
        5)进行获取代理操作。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755488.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号