为BeanFactory做一些准备工作
1.设置beanFactory 的类加载器;
2.设置EL表达式解析器(Bean创建完成填充属性时使用)和属性注册解析器
3.添加BeanPostProcessor
4.设置各种Aware接口的实现类为忽略自动装配
5.设置自动装配的类(BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext)
6.如果BeanFactory中存在loadTimeWeaver的bean,那么需要添加动态织入功能
7.注册各种可用组件(environment,systemProperties,systemEnvironment)
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
//设置beanFactory的类加载器
beanFactory.setBeanClassLoader(getClassLoader());
//添加Spring的EL表达式解析器。
if (!shouldIgnoreSpel) {
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
}
//为beanFactory增加了一个默认的propertyEditor(属性编辑器)
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
//添加到后置处理器,创建的 ApplicationContextAwareProcessor入参为当前 ApplicationContext
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//忽略自动装配,如果注入EnvironmentAware这个bd会注不进来
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.ignoreDependencyInterface(ApplicationStartup.class);
//注册自动装配的类
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
//添加后置处理器ApplicationListenerDetector
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// 是否需要类加载期间织入 增加Aspectj的支持
if (!IN_NATIVE_IMAGE && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
// 注册其他的 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());
}
if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
}
}
上面有添加三个BeanPostProcessor分别是:
这篇博客详细介绍了Spring中BeanFactory的初始化过程,包括设置类加载器、EL表达式解析器、属性编辑器、BeanPostProcessor等关键步骤。文章还提到了如何忽略特定的自动装配接口,并注册核心组件如Environment、SystemProperties等。文中提到了三个重要的BeanPostProcessor:ApplicationListenerDetector、ApplicationContextAwareProcessor和LoadTimeWeaverAwareProcessor,分别用于监听应用事件、实现ApplicationContext的感知和动态织入支持。
538

被折叠的 条评论
为什么被折叠?



