美文网首页
自己整理的一些关于Spring源码的总结,面试之前回来看看(不定

自己整理的一些关于Spring源码的总结,面试之前回来看看(不定

作者: 学到头冷 | 来源:发表于2020-09-04 16:21 被阅读0次

    Spring中的设计模式?

    1.工厂
    2.单例(看看内部枚举实现的单例)
    3.委派(delegate)
    4.模板方法(refresh方法算一个)
    5.策略模式
    6.访问者模式
    7.责任链模式(beanPostProcess这些后置处理器执行)

    Spring事务是怎么运作的?

    待更新

    Spring中的obtainfreshbeanfactory?(XML方式BeanDefinition如何注册)

    1.new DefaultListableBeanFactory 注册beandefinition的作用
    new BeanDefinitionReader
    把DefaultListableBeanFactory 和外部容器(实际上起到一个ResourceLoad的作用)放到BeanDefinitionReader

    2.解析阶段,利用ResourceLoad把xml解析成Document

    3.注册阶段,这个阶段前后还会有preProcessXML和postProcessXML两个处理器,然后创建BeanDefinitionParserDelegate(这个类包含xml中的标签的关键字和解析方式)然后通过delegate将Document转化成beandefinition并注册到DefaultListableBeanFactory

    注解方式BeanDefinition如何注册?

    1.refresh方法之前(也就是AbstractApplicationContext的构造方法中)就会生成一个DefaultListableBeanFactory,同时生成的还有AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner

    2.之后在refresh方法中会执行invokebeanfactorypostprocess

    3.beanfactorypostprocess分成两类,一类是beandefinitionregistrypostprocess,另一类是普通的beanfactorypostprocess,这两类beanfactorypostprocess根据priorityorder、order这些接口排序,先执行beandefinitionregistrypostprocess,然后再执行普通的beanfactorypostprocess。

    4.执行beandefinitionregistrypostprocess时,会通过ClassPathBeanDefinitionScanner去扫描加载类,解析,并注册到DefaultListableBeanFactory

    SpringBoot的启动流程?

    待更新

    不支持循环依赖的bean类型有哪些?

    1.多例bean

    2.构造方法注入的bean

    Spring中dogetbean具体实现?

    1.AbstractBeanFactory.doGetBean

    1.1.getSingleton,从三级缓存(singletonObjects,earlySingletonObjects,singletonObjects)中查找bean,如果是个objectFactory,会执行getobject方法并把bean放到二级缓存,并删除三级缓存中的内容。

    1.2.getObjectForBeanInstance,这里面如果是普通bean就直接返回了,如果是factoryBean还要在通过getObject方法再提取一下,并把它放到factoryBeanInstanceCache里面。

    1.3.如果从缓存里找不到,首先找到并合并父子beandefinition,然后获取该bean显示声明的dependson的依赖bean的名称,并递归掉用getbean方法获取依赖bean。

    1.4.getSingleton

    1.4.1.AbstractAutowiredCapableBeanFactory.creatBean

    1.4.1.1.如果实现了InstantiationAwareBeanPostProcessor这个接口(这个接口继承BeanPostProcessor,在实例化和初始化前后分别有4个后置方法,假如实现了实例化前方法并创建了bean,则会直接执行初始化的后置方法并返回bean,不会执行接下来的doCreatBean)。

    1.4.1.1.先查找factoryBeanInstanceCache有没有对应的beanwapper

    1.4.1.2.没有的话就直接createBeanInstance,尝试通过工厂方法,有参构造和无参构造创建出没有赋值的bean实例并包装成beanwapper,beanwapper里面包含未完成的实例和类型转换器。

    1.4.1.3.通过AutowiredAnnotationBeanPostProcessor对@autowire和@value的属性进行标记并生成injectMetaData进行缓存(这个类还用于属性注入)。

    1.4.1.4.将bean放到第三级的singletonFactory缓存中。

    1.4.1.5.populateBean

    1.4.1.5.1执行InstantiationAwareBeanPostProcessor的实例化后方法

    1.4.1.5.2执行AutowiredAnnotationBeanPostProcessor的inject方法进行属性输入

    1.4.1.5.initializeBean

    1.4.1.5.1如果bean实现了beanfactory、beanname、beanclassloader这些aware接口,则注入相关的bean

    1.4.1.5.2执行AutowiredAnnotationBeanPostProcessor的inject方法进行属性输入

    1.4.1.5.执行初始化前方法

    1.4.1.5.执行初始化方法

    1.4.1.5.执行初始化后方法

    1.4.2.把bean放入一级缓存,并删除二三级缓存。

    Spring中AOP实现?

    1.首先你要在配置类上加上@EnableAspectJAutoProxy这个注解,这个注解会import一个AspectJAutoProxyRegistrar类。

    2.在refresh方法中执行到invokeBeanfactory时,会通过AspectJAutoProxyRegistrar这个类想内部容器注册一个annotationAwareAspectJAutoproxyCreator,这个类就是AOP的核心

    3.这个类首先会在某个bean的实例化前置方法时找到增强类并封装成adviser放到缓存,之后在bean的初始化的后置方法中如果有需要则会对bean代理增强。如果实现了接口优先采用jdk动态代理,如果@EnableAspectJAutoProxy的注解上的属性proxytargetclass属性为true,则强制使用cglib代理

    相关文章

      网友评论

          本文标题:自己整理的一些关于Spring源码的总结,面试之前回来看看(不定

          本文链接:https://www.haomeiwen.com/subject/mtazsktx.html