知道容器新建了BeanFactory,并且解析配置文件中的 bean 为 BeanDefination 缓存起来了,接下来学习AbstractApplicationContext # prepareBeanFactory(beanFactory) 都干了啥!

    其主要的工作就是完善beanFactory的能力。
    配置类加载器,EL表达式解析器,属性解析器。

    1. // Tell the internal bean factory to use the context's class loader etc.
    2. // 设置类加载器,就是当前context的类加载器,用于加载bean
    3. beanFactory.setBeanClassLoader(getClassLoader());
    4. // 设置EL表达式解析器,为了可以使用类似${bean.xxx}的表达式
    5. beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    6. // 添加属性解析器,可以通过扩展增加自定义的属性解析器
    7. beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

    增加扩展对象

    1. /**
    2. * 将当前的ApplicationContext 交给 ApplicationContextAwareProcessor类处理。
    3. * beanFactory中使用一个集合存放这些扩展类。
    4. * private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();
    5. */
    6. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
    7. // 因为 ApplicationContextAwareProcessor 处理了以下接口,所以这里就直接忽略掉
    8. beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
    9. beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
    10. beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
    11. beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
    12. beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
    13. beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

    注册特殊的 bean,他们使用指定的对象注入。

    1. /**
    2. * registerResolvableDependency 表示该类型使用指定的对象注入
    3. * BeanFactory.class 注入 beanFactory 对象
    4. * ResourceLoader.class、ApplicationEventPublisher.class、ApplicationContext.class 注入this
    5. */
    6. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    7. beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    8. beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    9. beanFactory.registerResolvableDependency(ApplicationContext.class, this);

    注册监听器

    1. // 注册处理监听器
    2. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

    支持 Aspectj

    1. /**
    2. * 检查容器中是否包含名称为 loadTimeWeaver 的bean,其为了增加支持 Aspectj。
    3. * AspectJ 采用编译期织入(LTW:Load Time Weaver)、类加载期织入两种方式进行切面的织入。
    4. * LTW,通过特殊的类加载器来代理JVM默认的类加载器实现。
    5. */
    6. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
    7. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
    8. // Set a temporary ClassLoader for type matching.
    9. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    10. }

    注册环境相关的 bean

    1. // Register default environment beans.
    2. // 注册环境变量相关的bean
    3. if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
    4. beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
    5. }
    6. if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
    7. beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
    8. }
    9. if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
    10. beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
    11. }