核心子方法3: prepareBeanFactory(beanFactory)方法详解

先总结: 该方法对才创建的beanFactory进行准备工作, 对各种属性进行填充, 设置类型加载器, 设置EL表达式解析器, 设置默认的propertyEditor属性编辑器的注册器, 设置忽略自动装配的接口, 设置监听器, 注册之前prepareRefresh()方法获取的系统环境变量(Environment)相关的bean到一级缓存中等

1.设置beanFactory的classloader为当前context的classloader

  beanFactory.setBeanClassLoader(getClassLoader());

2.设置beanfactory的表达式解析器(EL表达式)

  beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));

3.为beanFactory增加一个默认的propertyEditor属性编辑器的注册器,这个主要是对bean的属性等设置管理的一个工具类

  beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

4.添加beanPostProcessor,ApplicationContextAwareProcessor此类用来完成某些Aware对象的注入

  beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

5.设置要忽略自动装配的接口,这些接口的实现是由容器通过set方法进行注入的,所以在使用autowire进行注入的时候需要将这些接口进行忽略

beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

6.设置几个自动装配的特殊规则,当在进行ioc初始化的如果有多个实现,那么就使用指定的对象进行注入, 类似于 @Primary

beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);

7.注册监听器BPP

  beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

8.增加对AspectJ的支持

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()));
}

9.注册默认的系统环境bean到一级缓存中

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());
}
posted @ 2024-02-29 17:34  小黑与小白  阅读(40)  评论(0)    收藏  举报