Spring-- Ioc 容器Bean实例化的几种场景

12 篇文章 0 订阅

Bean实例化的几种场景

 

1BeanDefinitionRegistryPostProcessor实例化:标准BeanFactoryPostProcessor的扩展,BeanFactoryPostProcessor的作用是用来进一步定义注册的BeanDefinitionIoC容器本质就是Bean管理,所以BeanFactoryPostProcessor本身也是Bean,要对BeanFactoryPostProcessorBeanDefinition进一步定义就通过BeanDefinitionRegistryPostProcessor进行注册,BeanDefinitionRegistryPostProcessor及其子类是Ioc容器最实例化的一类Bean。它们在ConfigurableApplicationContextApplicationContext子接口)实现类调用refresh()方法调用invokeBeanFactoryPostProcessors(beanFactory);方法时就被实例化。

 

2BeanFactoryPostProcessor实例化:仅次于BeanDefinitionRegistryPostProcessor被实例化。它们在同一个方法进行实例化,只是顺序有先后。

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactorybeanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors)


3BeanPostProcessorss实例化BeanPostProcessorsIoc容器Bean管理的扩展点,定义了Bean实例化前后的回调方法,那它实例化肯定是得比普通的Bean早。ConfigurableApplicationContext.registerBeanPostProcessors(beanFactory)方法负责对BeanPostProcessors进行实例化。实际上实例化BeanPostProcessor的类是PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory,this);

 

4MessageSource类型Bean实例化:对应refresh()调用的initMessageSource();

 

5ApplicationEventMulticaster(事件广播)类型Bean实例化:负责ApplicationEvent事件广播的beanrefresh()调用initApplicationEventMulticaster();进行实例化。这个Bean是不需要进行配置的,但它通用是在Ioc容器内,而且还是单例的。

 

6AbstractApplicationContext类的子类可能会实例化个性化的Beanrefresh()调用onRefresh();方法做这个事情。

 

7ApplicationListener类型Bean实例化:ApplicationEventMulticaster负责事件广播,它得注册广播对象,所有ApplicationListener都会在registerListeners();实例化。

 

1~7对应的Bean都是一些特殊的Bean,除6是由子类决定,其他的都是按照类型进行实例化,实例化调用的方法是:BeanFactoryString[] getBeanNamesForType(Class<?> type, booleanincludeNonSingletons, boolean allowEagerInit);方法,并且这些Bean设置lazy-init是无效的,设置singleton也是无效的

 

8、非lazy-initsingletonBean实例化:调用inishBeanFactoryInitialization(beanFactory);

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// 有容器转换服务bean时先实例化这种Bean
		if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
				beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
			beanFactory.setConversionService(
					beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
		}

		// 实例化LoadTimeWeaverAware类型Bean
		String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
		for (String weaverAwareName : weaverAwareNames) {
			getBean(weaverAwareName);
		}

		// 停止使用临时类加载器
		beanFactory.setTempClassLoader(null);

		// 缓存容器中所有注册的BeanDefinition元数据,以防被修改
		beanFactory.freezeConfiguration();

		// 实例化剩余的所有非lazy-init singleton Bean
		beanFactory.preInstantiateSingletons();
	}

9、其他Bean实例化场景:a.上述1-8对应的Bean实例化依赖其他Bean时,那个Bean同时被实例化(这个在分析createBean()说明);b.延迟实例化的singleton Bean在第一次通过getBean()主动实例化它时实例化;c.prototype每次调用getBean()时都实例化;其他Scope的在它的生命周期内第一次通过getBean()主动实例化时实例化。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值