Spring容器创建(一) BeanFactory 的预准备工作

AbstractApplicationContext类的代码

@Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();

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

            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.
                initMessageSource();

                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // Check for listener beans and register them.
                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);

                // Last step: publish corresponding event.
                finishRefresh();
            } 
        }
    }

Spring 容器的refresh();创建刷新

1.prepareRefresh();刷新前的预处理

protected void prepareRefresh() {
        this.startupDate = System.currentTimeMillis();
        this.closed.set(false);
        this.active.set(true);

        if (logger.isInfoEnabled()) {
            logger.info("Refreshing " + this);
        }

        // Initialize any placeholder property sources in the context environment
              //初始化一些属性设置;子类自定义个性化的属性设置方法。实现 继承AbstractApplicationContext 即可
        initPropertySources();

        // Validate that all properties marked as required are resolvable
        // see ConfigurablePropertyResolver#setRequiredProperties
//校验属性的合法性
        getEnvironment().validateRequiredProperties();

        // Allow for the collection of early ApplicationEvents,
        // to be published once the multicaster is available...
//用来保存容器事件
        this.earlyApplicationEvents = new LinkedHashSet<>();
    }

2. obtainFreshBeanFactory(); 获取BeanFactory

  1. refreshBeanFactory();刷新创建BeanFactory
  2. getBeanFactory()返回 GenericApplicationContext创建的BeanFactory对象
  3. 将创建的BeanFactory对象 (DefaultListableBeanFactory)返回
    protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
        refreshBeanFactory();
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        if (logger.isDebugEnabled()) {
            logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
        }
        return beanFactory;
    }
//进入`GenericApplicationContext`类
//构造对象的时候创建 DefaultListableBeanFactory 对象
          public GenericApplicationContext() {
        this.beanFactory = new DefaultListableBeanFactory();
    }
    @Override
    protected final void refreshBeanFactory() throws IllegalStateException {
        if (!this.refreshed.compareAndSet(false, true)) {
            throw new IllegalStateException(
                    "GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
        }
//
        this.beanFactory.setSerializationId(getId());
    }

3. prepareBeanFactory(beanFactory); BeanFactory 的预准备工作(对BeanFactory进行一些设置)

1. beanFactory.setBeanClassLoader(getClassLoader());添加类加载器
2. 添加一些不嫩beanpostprocessor
3. 设置忽略的自动装备的接口, 实现这些接口的实现类不能通过接口类型进行注入
@Component
public class Dog implements ApplicationContextAware {}

//上面组件是不允许下面这样子注入
@Autowired
private ApplicationContextAware applicationContextAware;
4. 注册可以解析的自动装配:我们能在任何组件中自动注入BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext.意思就是以上组件可以直接使用@Autowired注解,也可通过实现 xxxaware 接口来实现功能。
image.png

使用了 @Autowired 可以注入


image.png

没有注入为空


image.png
5. 添加BeanPostProcessor(ApplicationListenerDetector)
6. 添加编译时AspectJ
7. 给BeanFactory中注册一些能用的组件 environment[ConfigurableEnvironment],systemProperties[Map<String, Object>],systemEnvironment[Map<String, Object>]

可以从容器中获取
applicationContext.getEnvironment().getSystemProperties();
在组件总也可以直接注入

image.png

image.png
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // Tell the internal bean factory to use the context's class loader etc.
        beanFactory.setBeanClassLoader(getClassLoader());
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

        // Configure the bean factory with context callbacks.
                //添加  ApplicationContextAwareProcessor
        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
                //设置忽略的自动装备的接口
              // 实现这些接口的实现类不能通过接口类型进行注入
        beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
        beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

        // BeanFactory interface not registered as resolvable type in a plain factory.
        // MessageSource registered (and found for autowiring) as a bean.
//在组件中可以自动注入 的
        beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
        beanFactory.registerResolvableDependency(ResourceLoader.class, this);
        beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
        beanFactory.registerResolvableDependency(ApplicationContext.class, this);

        // Register early post-processor for detecting inner beans as ApplicationListeners.
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

        // Detect a LoadTimeWeaver and prepare for weaving, if found.
        if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            // Set a temporary ClassLoader for type matching.
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

        // Register default environment beans.
//给BeanFactory中注册一些能用的组件 
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }
        if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
        }
        if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
        }
    }

4. postProcessBeanFactory(beanFactory); BeanFactory 准备完成后进行后置处理。子类可以重写这个方法类来在BeanFactory创建并与准备完成以后做进一步的设置。

protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    }

下一篇 Spring容器创建(二) 执行BeanFactoryPostProcessor

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容