Spring IOC容器加载过程源码

要将类注入到IOC容器中成为一个Bean:

  • 通过xml、注解、javaconfig等方式进行配置类
  • 通过实例化不同的ApplicationContext实现来加载Spring上下文
    • 通过BeanDefinitionReader读取配置类
    • BeanDefinitionScanner扫描合格的Bean(比如加了@Component注解等)
    • BeanDefinitionRegistry注册成BeanDefinition(BeanDefinition是 Spring Framework 中定义 Bean 的配置元信息接口。BeanDefinition 并非 Bean 终态,可以自定义修改。)
    • 注册成BeanDefinition之后,ApplicationContext可以通过BeanFactoryPostProcessor扩展去修改BeanDefinition;
  • 将BeanDefinition交给BeanFactory,通过其getBean方法可以生产和获取Bean,中间会经历一系列实例化,填充属性,初始化等操作,其中还包括一些BeanPostProcessor来扩展生产过程;
  • 生产完成之后会将最终的Bean一级缓存singletonObjects中,再次获取时就从缓存中获取。

一、IOC容器加载过程

常见加载spring上下文两种方式:

  1. xml配置:ClassPathXmlApplicationContext(“xxx.xml”);

  2. 注解方式:AnnotationConfigApplicationContext(config.class);

实例化容器,以AnnotationConfigApplicationContext为例

// 加载spring上下文,同时传入自己的配置类Config
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

AnnotationConfigApplicationContext继承关系:

AnnotationConfigApplicationContext

从AnnotationConfigApplicationContext构造方法作为切入点:

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
   //1.调用无参构造函数
   this();
   //2.注册传入的配置类
   register(annotatedClasses);
   //3.IOC容器刷新接口
   refresh();
}

1.this()

  public GenericApplicationContext() {
     this.beanFactory = new DefaultListableBeanFactory();
  }	

  public AnnotationConfigApplicationContext() {
    this.reader = new AnnotatedBeanDefinitionReader(this);
    this.scanner = new ClassPathBeanDefinitionScanner(this);
  }

调用无参构造函数

  • 隐式调用父类GenericApplicationContext的构造函数,实例化一个Bean工厂DefaultListableBeanFactory(最底层的实现,功能最全),并且赋值给beanFactory;
  • 本类的构造函数实例化一个读取注解的Bean定义读取器AnnotatedBeanDefinitionReader和一个扫描器ClassPathBeanDefinitionScanner(此处的scanner用处不大)。

1.1BeanFactory

BeanFactory是Spring顶层核心接口。使用简单工厂模式,负责生产和获取Bean(通过getBean)。DefaultListableBeanFactory是其底层实现,继承关系如下:

DefaultListableBeanFactory

1.2BeanDefinitionReader

BeanDefinitionReader是负责读取配置的接口。实例化AnnotatedBeanDefinitionReader主要注册一些内置Bean。可以从构造方法依次进入到registerAnnotationConfigProcessors方法中查看相关代码。

其中注册的ConfigurationClassPostProcessor就是解析配置类的后置处理器,其他Bean注册流程也类似。

		//判断容器中是否已经存在
		if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      //如果不存在就通过RootBeanDefinition的构造方法获得ConfigurationClassPostProcessor的BeanDefinition,
			RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
			def.setSource(source);
      //注册Bean
			beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

2.register

注册传入的配置类,最终会调用到AnnotatedBeanDefinitionReader#doRegisterBean

  <T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {
		 ...
     BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
  }

2.1registerBeanDefinition

AnnotatedBeanDefinitionReader#doRegisterBean最终会调用DefaultListableBeanFactory中的registerBeanDefinition方法去注册,其中beanDefinitionNames用来保存beanName,beanDefinitionMap用来保存beanName和beanDefinition。

@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
      throws BeanDefinitionStoreException {
			...
      else {
         this.beanDefinitionMap.put(beanName, beanDefinition);
         this.beanDefinitionNames.add(beanName);
         this.manualSingletonNames.remove(beanName);
      }
			...
}

BeanDefinition结构图

image-20211101110803034

3.refresh

刷新容器。前两个方法分别实例化Bean工厂、注册一些内置的Bean和自己的配置类,refresh是重点方法。

@Override
public void refresh() throws BeansException, IllegalStateException {
   synchronized (this.startupShutdownMonitor) {
      prepareRefresh();

      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      prepareBeanFactory(beanFactory);

      try {
         postProcessBeanFactory(beanFactory);
				 //调用bean工厂后置处理器(BeanFactoryPostProcessors),注册BeanDefinition
         invokeBeanFactoryPostProcessors(beanFactory);
				 //注册bean后置处理器(BeanPostProcessors)
         registerBeanPostProcessors(beanFactory);

         initMessageSource();

         initApplicationEventMulticaster();

         onRefresh();

         registerListeners();
				 //将BeanDefinition通过getBean方法创建和获取Bean
         finishBeanFactoryInitialization(beanFactory);

         finishRefresh();
      }
			...

3.1invokeBeanFactoryPostProcessors

在前面实例化BeanDefinitionReader时,注册了ConfigurationClassPostProcessor的BeanDefinition;调用register方法注册了我们自己配置类的BeanDefinition。

在本方法中,ConfigurationClassPostProcessor会对配置类进行解析,解析@Configuration、@ComponentScan、@Import、@Bean等注解。

  protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    //getBeanFactoryPostProcessors()默认是空的(size=0),需要在外部调用context.addBeanFactoryPostProcessor添加我们自定义BeanFactoryPostProcessor
     PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
     ...
  }

PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

  • 按照优先级处理所有BeanDefinitionRegistryPostProcessor(PriorityOrdered>Ordered>没有实现优先级接口>postProcessBeanFactory方法)
  • 按照优先级处理所有BeanFactoryPostProcessor(PriorityOrdered>Ordered>没有实现优先级接口)
      public static void invokeBeanFactoryPostProcessors(
           ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

        //-----------------------------------------调用BeanDefinitionRegistryPostProcessor
        ...

        //判断beanFactory实现了BeanDefinitionRegistry(实现了该结构就有注册和获取Bean定义的能力)
        if (beanFactory instanceof BeanDefinitionRegistry) {
           ...

           //去容器中获取BeanDefinitionRegistryPostProcessor的bean的处理器名称
           String[] postProcessorNames =
                 beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
           for (String ppName : postProcessorNames) {
              //判断是否实现了PriorityOrdered接口的,作为第一优先级
              if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                 //显示的调用getBean()的方式获取该对象然后加入到currentRegistryProcessors集合中去
                 currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                 processedBeans.add(ppName);
              }
           }
           sortPostProcessors(currentRegistryProcessors, beanFactory);
           registryProcessors.addAll(currentRegistryProcessors);
           //调用。这里会调用ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry
           invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
           currentRegistryProcessors.clear();
          
           //处理后续优先级的BeanDefinitionRegistryPostProcessor(实现Order接口>没有实现优先级接口),逻辑类似
           ...   
             
			//调用postProcessBeanFactory方法,因为BeanDefinitionRegistryPostProcessor实现了BeanFactoryPostProcessor
      //这里会调用ConfigurationClassPostProcessor的postProcessBeanFactory 
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			...
		}             

  	//-----------------------------------------按照优先级处理BeanFactoryPostProcessor
    ...
ConfigurationClassPostProcessor

继承关系

1637305107668

ConfigurationClassPostProcessor实现了PriorityOrdered和BeanDefinitionRegistryPostProcessor,重写了postProcessBeanDefinitionRegistry和postProcessBeanFactory方法。

	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
		...
		processConfigBeanDefinitions(registry);
	}

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		...
		// 使用cglib对配置类进行代理,因为@Bean方法到时候要进行创建Bean的实例
		enhanceConfigurationClasses(beanFactory);
		beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));
	}

ConfigurationClassPostProcessor#processConfigBeanDefinitions

public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
		...

		//创建一个配置类解析器对象
		ConfigurationClassParser parser = new ConfigurationClassParser(
				this.metadataReaderFactory, this.problemReporter, this.environment,
				this.resourceLoader, this.componentScanBeanNameGenerator, registry);

		...
		do {
			//解析配置类
			parser.parse(candidates);
		...

ConfigurationClassParser
  public void parse(Set<BeanDefinitionHolder> configCandidates) {
     //用于来保存延时的ImportSelectors
     //其中包括SpringBoot自动装配的类 AutoConfigurationImportSelector
     this.deferredImportSelectors = new LinkedList<>();
     // 循环配置类
     for (BeanDefinitionHolder holder : configCandidates) {
        BeanDefinition bd = holder.getBeanDefinition();
        try {
           if (bd instanceof AnnotatedBeanDefinition) {
              parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName());
           }
           ...
     }
     //处理延时的DeferredImportSelectors 
     //springboot就是通过这步进行记载spring.factories文件中的自定装配的对象
     processDeferredImportSelectors();
  }
    
	protected final void parse(AnnotationMetadata metadata, String beanName) throws IOException {
		//把配置类源信息和beanName包装成一个ConfigurationClass对象
		processConfigurationClass(new ConfigurationClass(metadata, beanName));
	}   
    
	protected void processConfigurationClass(ConfigurationClass configClass) throws IOException {
		...
			sourceClass = doProcessConfigurationClass(configClass, sourceClass);
		...
	}   
    
  //doProcessConfigurationClass方法会解析@propertySource、@ComponentScan、@Import、@ImportResource、@Bean等注解
	protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)
			throws IOException {
		...
      
		//处理 @propertySource
		...

		//处理 @ComponentScan
		...

		// 处理 @Import
		...

		// 处理 @ImportResource 
		...

		// 处理 @Bean,获取配置类中所有标注了@Bean的方法
		...

		// 处理配置类接口,默认方法的@Bean
		...

		// 处理配置类的父类,循环再解析
		...
	}    

3.2finishBeanFactoryInitialization

实例化剩余的单例Bean

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
	 ...
   beanFactory.preInstantiateSingletons();
}

DefaultListableBeanFactory#preInstantiateSingletons

@Override
public void preInstantiateSingletons() throws BeansException {
   ...
   //获取容器中所有bean定义的名称
   List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

   //循环所有的bean定义名称
   for (String beanName : beanNames) {
      //合并bean定义,转换为统一的RootBeanDefinition类型
      RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
      /**
       * 要求bean定义不是抽象的&&是单例的&&不是懒加载的
       */
      if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
         //是不是工厂bean
         if (isFactoryBean(beanName)) {
            ...
         }
         else {//非工厂Bean 就是普通的bean
            getBean(beanName);
         }
      }
   }
   ...
}

二、Bean生命周期

1.整体流程

通过getBean方法,将BeanDefinition创建为Bean并获取到Bean。大致流程:

getBean

-----doGetBean

-----------getMergedLocalBeanDefinition BeanDefinition 合并阶段

-----------getSingleton

----------------createBean

---------------------resolveBeanClass Bean加载

---------------------resolveBeforeInstantiation Bean 实例化前阶段

---------------------doCreateBean 实例化、属性赋值,初始化

--------------------------createBeanInstance Bean 实例化阶段

--------------------------populateBean 属性赋值

-------------------------------postProcessAfterInstantiation Bean 实例化后阶段

-------------------------------postProcessPropertyValues Bean 属性赋值前阶段

-------------------------------applyPropertyValues Bean 属性赋值阶段

--------------------------initializeBean Bean初始化

-------------------------------invokeAwareMethods Bean Aware 接口回调阶段(不包括ApplicationContext相关)

-------------------------------applyBeanPostProcessorsBeforeInitialization Bean 初始化前阶段

-------------------------------invokeInitMethods Bean 初始化阶段

-------------------------------applyBeanPostProcessorsAfterInitialization Bean 初始化完成阶段


2.doGetBean

AbstractBeanFactory#doGetBean

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
      @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {

   ...
   //尝试去缓存中获取对象:一级>二级>三级
   Object sharedInstance = getSingleton(beanName);

   ...
         //创建单例bean
         if (mbd.isSingleton()) {
            //此处getSingleton不同于上面的getSingleton方法:前面的getSingleton主要是从缓存中获取对象,如果有直接返回;后面的getSingleton是把Bean标记成正在创建,作为循环依赖的出口
            sharedInstance = getSingleton(beanName, () -> {
               try {
                  //进入创建bean的逻辑
                  return createBean(beanName, mbd, args);
               }
               catch (BeansException ex) {
                  //创建bean的过程中发生异常,需要销毁关于当前bean的所有信息
                  destroySingleton(beanName);
                  throw ex;
               }
            });
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
         }
         ...
   return (T) bean;
}

3.createBean

AbstractAutowireCapableBeanFactory#createBean

@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
      throws BeanCreationException {

   ...
   // 把beanClass从String类型变成Class类型并返回该Class
   Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
   ...

   try {
      /**
       * 第1个bean后置处理器
       * 通过bean的后置处理器来进行后置处理生成代理对象,一般情况下在此处不会生成代理对象,因为真实的对象没有生			 * 成。这一步是aop和事务的关键,因为在这里解析aop切面信息进行缓存
       */
      Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
     	if (bean != null) {
				return bean;
			}
      ...
      Object beanInstance = doCreateBean(beanName, mbdToUse, args);
      ...
}

4.Bean实例化-初始化

-实例化是 Class 到 Object 的过程;初始化是 Object 状态准备的过程

4.1resolveBeforeInstantiation

默认返回null,表示继续 Spring IoC 容器的实例化操作;如果不为null,直接return,不走后续实例化操作

  @Nullable
	protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
		...
				if (targetType != null) {
					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
					if (bean != null) {
						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
					}
				...
	}
applyBeanPostProcessorsBeforeInstantiation

​ -InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(循环BeanPostProcessor,调用InstantiationAwareBeanPostProcessor类型的postProcessBeforeInstantiation)

@Nullable
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
   /**
    *获取容器中的所有后置处理器,
    *循环BeanPostProcessor,
    *调用InstantiationAwareBeanPostProcessor类型的postProcessBeforeInstantiation
    */
   for (BeanPostProcessor bp : getBeanPostProcessors()) {
      if (bp instanceof InstantiationAwareBeanPostProcessor) {
         InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
         /**
          * 【很重要】
          * AOP @EnableAspectJAutoProxy为容器中导入了 AnnotationAwareAspectJAutoProxyCreator
          * 事务注解@EnableTransactionManagement为容器导入了 InfrastructureAdvisorAutoProxyCreator
          * 都是实现了BeanPostProcessor接口,InstantiationAwareBeanPostProcessor,进行后置处理解析切面
          */
         Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
         if (result != null) {
            return result;
         }
      }
   }
   return null;
}
4.2doCreateBean

AbstractAutowireCapableBeanFactory#doCreateBean

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {

   ...
      //创建bean实例化,使用合适的实例化策略来创建新的实例(两种方式:反射、工厂)
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }
   //从beanWrapper中获取我们的早期对象
   final Object bean = instanceWrapper.getWrappedInstance();
   Class<?> beanType = instanceWrapper.getWrappedClass();
   ...
   // Initialize the bean instance.
   Object exposedObject = bean;
   try {
      //属性赋值 给我们的属性进行赋值(调用set方法进行赋值)
      populateBean(beanName, mbd, instanceWrapper);
      //进行对象初始化操作(在这里可能生成代理对象)
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   ...
createBeanInstance

返回一个instanceWrapper,装饰器模式
​ -instantiateBean
​ -getInstantiationStrategy()#instantiate()

populateBean

默认返回true,则继续进行后续的属性赋值流程;如果返回false,则直接return,不走后续的属性赋值操作

		...
		//是否持有 InstantiationAwareBeanPostProcessor
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			//获取容器中的所有的BeanPostProcessor
      //循环BeanPostProcessor,调用InstantiationAwareBeanPostProcessor类型的postProcessAfterInstantiation
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					//调用InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
          //若存在后置处理器给我们属性赋值了,那么返回false,就不会走下面的逻辑了
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						continueWithPropertyPopulation = false;
						break;
            
		...
      
			if (hasInstAwareBpps) {
				//获取所有的后置处理器
				for (BeanPostProcessor bp : getBeanPostProcessors()) {
					if (bp instanceof InstantiationAwareBeanPostProcessor) {
						InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
						//对依赖对象进行后置处理
						pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
						if (pvs == null) {
							return;
						}
					}
				}
			}
		...
		if (pvs != null) {
			applyPropertyValues(beanName, mbd, bw, pvs);
		}      
initializeBean

AbstractAutowireCapableBeanFactory#initializeBean

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
   ...
   else {
      //若bean实现了XXXAware接口进行方法的回调
      invokeAwareMethods(beanName, bean);
   }
   Object wrappedBean = bean;
   if (mbd == null || !mbd.isSynthetic()) {
      //调用我们的bean的后置处理器的postProcessorsBeforeInitialization方法
      wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
   }

   try {
      //调用初始化方法
      invokeInitMethods(beanName, wrappedBean, mbd);
   }
   ...
   if (mbd == null || !mbd.isSynthetic()) {
      //调用我们bean的后置处理器的PostProcessorsAfterInitialization方法
      wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
   }
   return wrappedBean;
}
invokeAwareMethods

调用顺序BeanNameAware > BeanClassLoaderAware > BeanFactoryAware(不包括ApplicationContext相关Aware 接口,DefaultListableBeanFactory无法使用非 public 类 ApplicationContextAwareProcessor)

private void invokeAwareMethods(final String beanName, final Object bean) {
		if (bean instanceof Aware) {
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean).setBeanName(beanName);
			}
			if (bean instanceof BeanClassLoaderAware) {
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

applyBeanPostProcessorsBeforeInitialization

​ -AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
​ -BeanPostProcessor#postProcessBeforeInitialization
​ -initPostConstruct 初始化(@PostConstruct注释)

	@Override
	public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException {
    ...
    //循环BeanPostProcessor调用,
    //包含CommonAnnotationBeanPostProcessor接口和ApplicationContextAwareProcessor的postProcessBeforeInitialization中的Aware接口回调
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			Object current = processor.postProcessBeforeInitialization(result, beanName);
			...
	}
invokeInitMethods

​ -AbstractAutowireCapableBeanFactory#invokeInitMethods
​ -afterPropertiesSet 初始化(重写)
​ -invokeCustomInitMethod 初始化(自定义)

protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) throws Throwable {

		...
				((InitializingBean) bean).afterPropertiesSet();
			...
				invokeCustomInitMethod(beanName, bean, mbd);
        ...
applyBeanPostProcessorsAfterInitialization
	@Override
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
		//获取我们容器中的所有的bean的后置处理器,循环BeanPostProcessor调用postProcessAfterInitialization
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			/**
			 * aop和事务都会在这里生存代理对象
			 *
			 *
			 * AOP @EnableAspectJAutoProxy 为容器中导入了 AnnotationAwareAspectJAutoProxyCreator
			 * 事务注解@EnableTransactionManagement 为容器导入了 InfrastructureAdvisorAutoProxyCreator
			 * 都是实现了BeanPostProcessor接口,InstantiationAwareBeanPostProcessor,
			 * 在这里实现的是BeanPostProcessor接口的postProcessAfterInitialization来生成代理对象
			 */
			Object current = processor.postProcessAfterInitialization(result, beanName);
			...
	}

5.加入缓存

Bean初始化完成之后,会加入到缓存中,下次getBean就直接从缓存中获取。DefaultSingletonBeanRegistry

	/** 一级缓存 这个就是单例缓存池 用于保存我们所有的单实例bean */
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

	/** 三级缓存 该map用户缓存 key为 beanName  value 为ObjectFactory(包装为早期对象) */
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

	/** 二级缓存 ,用户缓存我们的key为beanName value是我们的早期对象(对象属性还没有来得及进行赋值) */
	private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

  public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
        ...
           if (newSingleton) {
              //加入缓存中
              addSingleton(beanName, singletonObject);
           }
        }
        return singletonObject;
     }
  }

  protected void addSingleton(String beanName, Object singletonObject) {
     synchronized (this.singletonObjects) {
        //加入到单例缓存池中
        this.singletonObjects.put(beanName, singletonObject);
        //从三级缓存中移除(针对的不是处理循环依赖的)
        this.singletonFactories.remove(beanName);
        //从二级缓存中移除(循环依赖的时候 早期对象存在于二级缓存)
        this.earlySingletonObjects.remove(beanName);
        //用来记录保存已经处理的bean
        this.registeredSingletons.add(beanName);
     }
  }

三、Spring中扩展点

BeanFactoryPostProcessor:主要针对BeanDefinition进行扩展,生产Bean之前调用。

BeanDefinitionRegistryPostProcessor:主要用于注册BeanDefinition,生产Bean之前调用。

BeanPostProcessor:主要针对Bean进行扩展,生产Bean过程中调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值