目录
1. ScopeBeanFactory与BeanFactory对比
2. 注册Bean
3. 执行一系列的PostProccessor
1. ScopeBeanFactory与BeanFactory对比
ScopeBeanFactory是Dubbo自己定义的管理Bean的一个类, 类似于Spring BeanFactory注册管理Bean的方式, 不同的是Spring BeanFactory是一个接口,主要实现是DefaultListableBeanFactory。

ScopeBeanFactory的设计思想类似于Spring 的BeanFactory, 对比如下:
| Dubbo | Spring | 其他 | |
| 描述Bean的方式 | BeanInfo对象 | BeanDefinition接口 | |
| 有无父亲 | 包含parent, 在本类里定义。 | 包含parent , BeanFactory, 在AbstractBeanFactory抽象类里定义。 | 他们在getBean时都先找自己的,自己没有再找父亲的, 判断的时候如果自己没有,那么直接返回false, 因为父亲那儿也时基于儿子的。 | 
| 存放容器 | CopyOnWriteArrayList | ConcurrentHashMap | |
| 初始化Bean后的操作 | 执行initializeBean方法,然后执行所有的ExtensionPostProccess | Bean 初始化结束后在AbstractAutowireCapableBeanFactory类里applyBeanPostProceesorAfterInitialization(Object existingBean, String name) | |
| PostProcessor | ExtensionAccessor接口提供了一系列的ExtensionPostProcessor | 在AbstractAutowireCapableBeanFactory抽象类里通过一个CopyOnWriteArrayList存放了所有的BeanPostProccessor | 注册Bean完成后执行 | 
由上,我感觉ScopeBeanFactory就是一个简化版的BeanFactory,接着跟着代码一探究竟。
2. 注册Bean
注册Bean, 通过name 和对象可以直接注册Bean。
    
    public void registerBean(Object bean) {
        this.registerBean(null, bean);
    }
    public void registerBean(String name, Object bean) {
        checkDestroyed();
        // avoid duplicated register same bean
        if (containsBean(name, bean)) {
            return;
        }
        Class<?> beanClass = bean.getClass();
        if (name == null) {
            name = beanClass.getName() + "#" + getNextId(beanClass);
        }
        initializeBean(name, bean);
        registeredBeanInfos.add(new BeanInfo(name, bean));
    }
 
this.getOrRegisterBean, 如果没有Bean,那么根据class创建Bean
    public <T> T getOrRegisterBean(String name, Class<T> type) {
        T bean = getBean(name, type);
        if (bean == null) {
            // lock by type
            synchronized (type) {
                bean = getBean(name, type);
                if (bean == null) {
                    bean = createAndRegisterBean(name, type);
                }
            }
        }
        return bean;
    } 
也通过supplier传进来一个Bean, 执行apply 方法的时候回调。
    public <T> T getOrRegisterBean(Class<T> type, Function<? super Class<T>, ? extends T> mappingFunction) {
        return getOrRegisterBean(null, type, mappingFunction);
    }
    public <T> T getOrRegisterBean(String name, Class<T> type, Function<? super Class<T>, ? extends T> mappingFunction) {
        T bean = getBean(name, type);
        if (bean == null) {
            // lock by type
            synchronized (type) {
                bean = getBean(name, type);
                if (bean == null) {
                    // 执行目标方法,得到bean对象。
                    bean = mappingFunction.apply(type);
                    registerBean(name, bean);
                }
            }
        }
        return bean;
    }
 
3. 执行一系列的PostProccessor
注册Bean后的初始化,执行类似于Spring 的Bean的初始化动作:
        执行一系列的PostProcessor, Spring里叫BeanPostProcessor, 这里只是换了个名字叫ExtensionPostProcessor。
    private void initializeBean(String name, Object bean) {
        checkDestroyed();
        try {
            if (bean instanceof ExtensionAccessorAware) {
                ((ExtensionAccessorAware) bean).setExtensionAccessor(extensionAccessor);
            }
            // 执行postProcessAfterInitialization(bean,name), 执行一系列的BeanPostProccessor
            for (ExtensionPostProcessor processor : extensionPostProcessors) {
                processor.postProcessAfterInitialization(bean, name);
            }
        } catch (Exception e) {
            throw new ScopeBeanException("register bean failed! name=" + name + ", type=" + bean.getClass().getName(), e);
        }
    } 
Spring 会在初始化完毕后,AbstractAutowireCapableBeanFactory实现了执行一系列的BeanPostProcessor
    protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
        if (System.getSecurityManager() != null) {
            AccessController.doPrivileged(new PrivilegedAction<Object>() {
                public Object run() {
                    AbstractAutowireCapableBeanFactory.this.invokeAwareMethods(beanName, bean);
                    return null;
                }
            }, this.getAccessControlContext());
        } else {
            this.invokeAwareMethods(beanName, bean);
        }
        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
        }
        try {
            this.invokeInitMethods(beanName, wrappedBean, mbd);
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
        }
        // 执行postProceesorAfterInitialization
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }
        return wrappedBean;
    } 
进入到 applyBeanPostProcessorsAfterInitialization方法:
    public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {
        Object result = existingBean;
        Iterator i$ = this.getBeanPostProcessors().iterator();
        do {
            if (!i$.hasNext()) {
                return result;
            }
            // 执行postProcessor
            BeanPostProcessor beanProcessor = (BeanPostProcessor)i$.next();
            result = beanProcessor.postProcessAfterInitialization(result, beanName);
        } while(result != null);
        return result;
    }
 
看了代码后,我感觉Dubbo的ScopeBeanFactory的实现基本是借鉴于Spring 的BeanFactory的设计实现 ,更清晰明了啦。



















![[carla入门教程]-1 安装carla环境](https://img-blog.csdnimg.cn/e2786b708614436782c033adcb0486c6.png)