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接口重写固定方法进行初始化

  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/zzq-include/p/12219507.html
Copyright © 2011-2022 走看看