prepareBeanFactory与postProcessBeanFactory
prepareBeanFactory
翻译过来是 准备bean工厂,其实就是配置bean工厂的上下文环境,例如 ClassLoader 和 post-processors.
1. 设置类加载器
beanFactory.setBeanClassLoader(getClassLoader());
2.设置 SpEL解析器
if (!shouldIgnoreSpel) {
// Spring3 增加了表达式语言的支持
// bean 定义值中表达式的解析策略 设置 Bean 表达式解析器
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
}
3. 设置属性解析器用于注入依赖解析
<bean id="userManager" class="UserManager">
<property name="data" value="2018-08-01 00:00:00"/>
</bean>
直接 注入就会 类型转换不成功 所以需要属性解析器转换格式
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
4. 设置 AwareProcessor
// 主要为了 后续 bean初始化时 aware 操作 使 bean 感知到 容器的存在
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
5. 设置忽略依赖 不保存在bean容器中
跳过以下6个属性的自动注入
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(ApplicationStartupAware.class);
6.注入特殊的依赖类型
设置自动装配的类(BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext)
//设置了几个自动装配的特殊规则 简化了底层组件的注入问题
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
7.增加对 AspectJ 的支持
// 增加对 AspectJ 的支持
if (!NativeDetector.inNativeImage() && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
//如果BeanFactory中存在loadTimeWeaver的bean,那么需要添加动态织入功能
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// 为类型匹配设置一个临时的 ClassLoader.
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
8.添加 默认的系统环境 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());
}
postProcessBeanFactory
根据应用程序上下文的标准修改其内部bean工厂初始化。所有bean定义都已加载,但没有bean将被实例化。这允许注册特殊用户某些ApplicationContext实现中的BeanPostProcessor等。
我感觉这个方法是spring提供的对beanFactory的一个扩展点允许自定义他的实现,从而对 beanFactory内容的修改或者增加。