zoukankan      html  css  js  c++  java
  • spring容器启动

    1 无论是classpathxml还是annotation,最后都会走到AbsApplicationContext的refresh方法中。

    2 到达refresh方法中总流程共有13个方法。

    3 为spring上下文创建BeanFactory
    3-1 首先会通过obtainFreshBeanFactory方法创建一个BeanFactory,它是spring上下文顶层接口,比如getBean方法都在这个接口中约定的。
    obtainFreshBeanFactory方法实际调用的是AbstractRefreshApplicationContext对象的getBeanFactory方法获得的,实际就是new了一个DefaultListableBeanFactory(getInternalParentBeanFactory());

    3-2 扫描特殊注解类(@Configuration @CompomentScan @Import等),通过ConfigurationClassPostProcess,来获取注解,并解析bean的范围,去生成beanDefinition。

    3-3 通过DefaultListableBeanFactory进行loadBeanDefinitions,来扫描配置文件,或是扫描注解,来进行bean的定义。

    4 进行singleton的bean初始化工作
    4-1 获取beanDefinitions,会判断是否为FactoryBean,如果是的话,首先会获得&+beanName,并通过beanFactory的getBean方法先进行,实际bean的生产;因为这个bean已经交给了FactoryBean进行创建。

    5 bean的初始化核心方法有3个(bean的生命周期)

    5-1 首先调用createBeanInstance方法, 在这个方法中spring会去推断构造函数,ps:默认使用无参构造函数,如果有参数,它会获得参数最多,最具体的构造函数,并且按照public优先级最高原则。

    ****5-1和5-2之间,在这3个方法之前还会将当前对象加入正在创建的集合:singletonsCurrentlyInCreationSet中,并且加入singletonFactories中***

    5-2 之后调用populateBean方法,来进行属性注入。

    5-3 最后调用initializationBean方法,首先会进行对原始bean对象的最终处理,在这个方法中会调用bean的后置处理器BeanPostProcess,这是BeanFactory的处理器,针对每个bean的初始化都要经过的处理器;

    核心方法调用链:

    (0)第一步调用invokeAwareMethods方法

    if (bean instanceof BeanNameAware) {//传递bean名称
    ((BeanNameAware) bean).setBeanName(beanName);
    }
    if (bean instanceof BeanClassLoaderAware) {//传递类加载器
    ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
    }
    if (bean instanceof BeanFactoryAware) {//传递beanFactory
    ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
    }

    (1)postProcessBeforeInitialization,这里一般不做什么。

    (2)在调用init-method(当然是和容器关闭时的destroy方法是同样的)初始化方法,进行初始化赋值。

    (3)最后postprocessAfterInitialization方法,这个方法最重要

    如果我们bean需要被aop,则spring会在postprocessAfterInitialization阶段进行代理对象的生成

    @Override
        public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
                throws BeansException {
    
            Object result = existingBean;
    //下面方法中循环的bean处理器有这几个

            ApplicationContextAwareProcessor
            PostProcessRegistrationDelegate
            AspectJAwareAdvisorAutoProxyCreator//这才是“代理对象生成的后置处理器”。如果有接口用jdk动态代理,如果没有接口或显示指定了使用目标类产生代理则使用cglib代理
            ApplicationListenerDetector

    for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
                result = beanProcessor.postProcessAfterInitialization(result, beanName);
                if (result == null) {
                    return result;
                }
            }
            return result;
        }

    ======================================== 

    创建bean的几种方式:(1)@Bean注解,(2)@Component,(3)FactoryBean,(4)@Import的三种方式

    bean的初始化方式:

    (1)通过init-method和destroy-method方法来处理(@Bean注解的bean可以这样使用)

    (2)通过注解@PostConstruct和@PreDestroy(@Component这种bean可以这样使用)

    (3)也可以通过实现InitializationBean接口重写固定方法进行初始化

  • 相关阅读:
    DRF小结
    js中BOM与DOM的概念与区别
    css单位分析、颜色设置与调色板
    css中伪类与伪元素的区别
    flexbox与grid layout的区别
    grid的简单使用
    position属性的总结
    html,css
    homework
    aboutme and my goal
  • 原文地址:https://www.cnblogs.com/zzq-include/p/12219507.html
Copyright © 2011-2022 走看看