spring5.0 源码解析(day02) prepareBeanFactory

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内容的修改或者增加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1999

每人一点点,明天会更好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值