专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Spring 源码之 bean实例化,初始化流程

AbstractApplicationContext#refresh

public void refresh() { synchronized (this.startupShutdownMonitor) { //准备刷新,初始化一些标志,比如active=true,closed=false,准备环境 //Prepare this context for refreshing. prepareRefresh();

        // Tell the subclass to refresh the internal bean factory.
        //获得bean工厂
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // Prepare the bean factory for use in this context
        //准备bena工厂,比如往bena工厂添加类加载器,添加el表达式解析器
        //添加一些beanpostprocessor 比如 ApplicationContextAwareProcessor
        //和ApplicationListenerDetector
        //往ApplicationListenerDetector添加一些依赖
        prepareBeanFactory(beanFactory);

        try {
            // Allows post-processing of the bean factory in context subclasses.
            //钩子方法,让子类去操作bean工厂
            postProcessBeanFactory(beanFactory);

            // Invoke factory processors registered as beans in the context
            //很重要,执行beanFactoryPostProcessors ,后面讲
            invokeBeanFactoryPostProcessors(beanFactory);

            // Register bean processors that intercept bean creation.
            //其实就是往 beanPostProcessors 注册beanPostProcessor 
            //bean的后置处理器,在实例化和初始化bean的时候都会用到
            //也是spring的扩展点之一
            registerBeanPostProcessors(beanFactory);

            // Initialize message source for this context.
            //初始化 国际化用的 messagesource
            initMessageSource();

            // Initialize event multicaster for this context.
            //初始化监听用的广播器 ApplicationEventMulticaster
            initApplicationEventMulticaster();

            // Initialize other special beans in specific context subclasses.
            //在springboot中
            //会回调子类方法:ServletWebServerApplicationContext#onRefresh
            //在子类方法中会 调用createWebServer()方法去创建容器
            onRefresh();

            // Check for listener beans and register them.
            //往广播器 注册一些监听器,监听器用set管理起来的
            //因为springboot启动的时候也会往set注册监听器,set就不会重复了
            registerListeners();

            // Instantiate all remaining (non-lazy-init) singletons.
            //重点,开始往spring单例池中注册bean
            finishBeanFactoryInitialization(beanFactory);

            // Last step: publish corresponding event.
            //没研究,看上面的英文注释,是推送事件???
            finishRefresh();
        }

AbstractApplicationContext#finishBeanFactoryInitialization

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
         //....忽略不影响主流程代码
        // Instantiate all remaining (non-lazy-init) singletons.
        beanFactory.preInstantiateSingletons();
    }

DefaultListableBeanFactory#preInstantiateSingletons

public void preInstantiateSingletons(){
    .....
    //把beandefinition 从beanDefinitionNames 这个map拿出来,遍历
    //实例化,促使化需要被spring管理的bena
    getBean(beanName);
    .....
}

AbstractBeanFactory#doGetBean

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
            @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
              //获取beanname
        final String beanName = transformedBeanName(name);
        Object bean;
        // Eagerly check singleton cache for manually registered singletons.
        //先从单例池中根据bean名称获取bean,如果拿不到,就先去 //singletonsCurrentlyInCreation 这个list中拿,
        //这个主要是bean在实例化的时候放进去的,表示bean正在创建
        //如果bean正在创建,从earlySingletonObjects这个map拿
        //如果拿不到就从singletonFactories拿bean的objectFactory(bean实例化之后放进去)
        //如果拿到就放到 earlySingletonObjects,取出singletonFactories的引用
        //这个方法可以解决循环依赖 很重要
        Object sharedInstance = getSingleton(beanName);
             ........
            if (!typeCheckOnly) {
            //将bean名称放到 alreadyCreated
            //表示正在创建,这个倒是没看到后续有啥用
                markBeanAsCreated(beanName);
            }
            try {
            //合并父类的属性
                final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                checkMergedBeanDefinition(mbd, beanName, args);
            ..........
                // Create bean instance.  重要
                if (mbd.isSingleton()) {
                    sharedInstance = getSingleton(beanName, () -> {
                        try {
                        //最重要的逻辑在这里
                            return createBean(beanName, mbd, args);
                        }
                    });
                    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                }
          ............
        return (T) bean;
    }

DefaultSingletonBeanRegistry#getSingleton

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
        Assert.notNull(beanName, "Bean name must not be null");
        synchronized (this.singletonObjects) {
        //再次从单例池中获取bean
            Object singletonObject = this.singletonObjects.get(beanName);
            if (singletonObject == null) {
             .......
             //在bean实例化前先放到一个list中去,告诉别人,这个bean在实例化了
             //放到 singletonsCurrentlyInCreation
                beforeSingletonCreation(beanName);
             ...........
                try {
                //开始实例化,初始化bean
                    singletonObject = singletonFactory.getObject();
                    newSingleton = true;
                }
                ...........  
                finally {
                    //实例化完bean,将beanname从singletonsCurrentlyInCreation
                    //移除,因为已经实例化完了
                    afterSingletonCreation(beanName);
                }
                //如果是单例
                if (newSingleton) {
            //往singletonObjects这个单例池中放bean,这个可以说就是狭义的ioc容器
            //移除 singletonFactories,earlySingletonObjects,registeredSingletons
            //这个三个容器,会在 singletonFactory.getObject() 这里放进去
            //到这里spring就完成了对bean的管理,放到容器也就是一个map中
                    addSingleton(beanName, singletonObject);
                }
            }
            return singletonObject;
        }
    }

singletonFactory.getObject() 做了什么?就是前面说的 AbstractAutowireCapableBeanFactory#createBean

AbstractAutowireCapableBeanFactory#createBean

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args){
      //解析出 class
        Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    ..............  
        try {
            // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
          // 调用InstantiationAwareBeanPostProcessor 看是否有实例
          //如果有就不走后续流程
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            if (bean != null) {
                return bean;
            }
        }
             ...............
        try {
        //创建bean,最终要的步骤
            Object beanInstance = doCreateBean(beanName, mbdToUse, args);
            return beanInstance;
        }
        ...........
    }

AbstractAutowireCapableBeanFactory#doCreateBean

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
            throws BeanCreationException {

        // Instantiate the bean.
        BeanWrapper instanceWrapper = null;
      ........
        if (instanceWrapper == null) {
        //实例化bean,然后放到BeanWrapperImpl
            instanceWrapper = createBeanInstance(beanName, mbd, args);
        }
        final Object bean = instanceWrapper.getWrappedInstance();
     ................
        // Allow post-processors to modify the merged bean definition.
        synchronized (mbd.postProcessingLock) {
            if (!mbd.postProcessed) {
                try {
            //调用 MergedBeanDefinitionPostProcessor 去将类中的注解缓存下来
            //为了后续依赖注入等做准备
                    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                }
            ..............
            }
        }
           ...........
        if (earlySingletonExposure) {
           ............
           //很重要,做了两件事情
           //1.调用SmartInstantiationAwareBeanPostProcessor 判断是否需要包装bean
           //在aop上有使用到
           //2.将实例化的对象,放到singletonFactories这个map,可以解决循环依赖
            addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
        }
        // Initialize the bean instance.
        Object exposedObject = bean;
        try {
        //填充属性
            populateBean(beanName, mbd, instanceWrapper);
        //初始化对象
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
     ...........
        return exposedObject;
    }

实例化对象:AbstractAutowireCapableBeanFactory#createBeanInstance

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
        // Make sure bean class is actually resolved at this point.
        //解析出class
        Class<?> beanClass = resolveBeanClass(mbd, beanName);
     ..............
        // Candidate constructors for autowiring?
        //调用 SmartInstantiationAwareBeanPostProcessor 判断要使用那个构造方法进行实例化
        Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
        if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
                mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
                //使用特殊的构造方法实例化
            return autowireConstructor(beanName, mbd, ctors, args);
        }

        // Preferred constructors for default construction?
        ctors = mbd.getPreferredConstructors();
        if (ctors != null) {
            return autowireConstructor(beanName, mbd, ctors, null);
        }
//使用默认的构造方法实例化,实例化其实就是调用java反射
        // No special handling: simply use no-arg constructor.
        return instantiateBean(beanName, mbd);
    }

里面还有很多复杂的逻辑,比如怎么填充属性,怎么做到依赖注入,怎么对对象初始化等等……….

文章永久链接:https://tech.souyunku.com/26709

未经允许不得转载:搜云库技术团队 » Spring 源码之 bean实例化,初始化流程

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们