Spring 源码(10)Spring Bean 的创建过程(1)

本文详细介绍了Spring中Bean的创建步骤,包括BeanDefinition的合并处理、FactoryBean的概念及其与BeanFactory的区别。FactoryBean允许灵活地自定义对象创建方式,而BeanFactory则是Bean的创建工厂。在Spring的Bean生命周期中,FactoryBean的使用提供了额外的控制和延迟初始化的特性。
摘要由CSDN通过智能技术生成

Spring Bean 的创建刚开始进行了一些准备工作,比如转换服务的初始化,占位符解析器的初始化, BeanDefinition 元数据的冻结等操作,都是为了在创建Bean的过程中保证 Bean 的正确的创建,接下来开始进行对 Bean 的创建进行解析。

Bean 的创建步骤

在 Spring 源码中对 Bean 的创建遵循一个步骤就是: getBean --> doGetBean --> createBean --> doCreateBean ,常规的 Bean 的创建过程都是按照这个步骤执行,然后反射实例化,属性填充,初始化,放到一级缓存中。那么非常规的有可能就不遵循这个步骤,比如 FactoryBean , InstantiationAwareBeanPostProcessor 等。

上源码:

public void preInstantiateSingletons() throws BeansException {
  if (logger.isTraceEnabled()) {
    logger.trace("Pre-instantiating singletons in " + this);
  }

  // Iterate over a copy to allow for init methods which in turn register new bean definitions.
  // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
  List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

  // Trigger initialization of all non-lazy singleton beans...
  // 遍历所有的beanName
  for (String beanName : beanNames) {
    // 获取RootBeanDefinition 从缓存中,第一个放入缓存是在 AbstractApplicationContext#invokeBeanFactoryPostProcessors 中的getBeanNamesForType方法中
    RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
    // 如果不是抽象的,是单例的,是非懒加载的,则进行bean的创建,否则直接跳过
    if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
      // 是否是FactoryBean
      if (isFactoryBean(beanName)) {
        // 获取bean实例
        Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
        // 判断获取的Bean是否是FactoryBean
        if (bean instanceof FactoryBean) {
          FactoryBean<?> factory = (FactoryBean<?>) bean;
          // 是否是饥饿初始化,默认是false
          boolean isEagerInit;
          // 权限校验
          if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
            isEagerInit = AccessController.doPrivileged(
              (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
              getAccessControlContext());
          }
          else {
            isEagerInit = (factory instanceof SmartFactoryBean &&
                           ((SmartFactoryBean<?>) factory).isEagerInit());
          }
          // 如果是饥饿初始化,则进行bean的创建
          if (isEagerInit) {
            getBean(beanName);
          }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值