Spring-- Ioc 容器Bean实例化的几种场景
2014-11-23 20:32
543 查看
Bean实例化的几种场景
1、BeanDefinitionRegistryPostProcessor实例化:标准BeanFactoryPostProcessor的扩展,BeanFactoryPostProcessor的作用是用来进一步定义注册的BeanDefinition,IoC容器本质就是Bean管理,所以BeanFactoryPostProcessor本身也是Bean,要对BeanFactoryPostProcessor的BeanDefinition进一步定义就通过BeanDefinitionRegistryPostProcessor进行注册,BeanDefinitionRegistryPostProcessor及其子类是Ioc容器最实例化的一类Bean。它们在ConfigurableApplicationContext(ApplicationContext子接口)实现类调用refresh()方法调用invokeBeanFactoryPostProcessors(beanFactory);方法时就被实例化。
2、BeanFactoryPostProcessor实例化:仅次于BeanDefinitionRegistryPostProcessor被实例化。它们在同一个方法进行实例化,只是顺序有先后。
3、BeanPostProcessorss实例化:BeanPostProcessors是Ioc容器Bean管理的扩展点,定义了Bean实例化前后的回调方法,那它实例化肯定是得比普通的Bean早。ConfigurableApplicationContext.registerBeanPostProcessors(beanFactory)方法负责对BeanPostProcessors进行实例化。实际上实例化BeanPostProcessor的类是PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory,this);
4、MessageSource类型Bean实例化:对应refresh()调用的initMessageSource();
5、ApplicationEventMulticaster(事件广播)类型Bean实例化:负责ApplicationEvent事件广播的bean,refresh()调用initApplicationEventMulticaster();进行实例化。这个Bean是不需要进行配置的,但它通用是在Ioc容器内,而且还是单例的。
6、AbstractApplicationContext类的子类可能会实例化个性化的Bean,refresh()调用onRefresh();方法做这个事情。
7、ApplicationListener类型Bean实例化:ApplicationEventMulticaster负责事件广播,它得注册广播对象,所有ApplicationListener都会在registerListeners();实例化。
1~7对应的Bean都是一些特殊的Bean,除6是由子类决定,其他的都是按照类型进行实例化,实例化调用的方法是:BeanFactory的String[]
getBeanNamesForType(Class<?> type, booleanincludeNonSingletons, boolean allowEagerInit);方法,并且这些Bean设置lazy-init是无效的,设置singleton也是无效的
8、非lazy-init且singleton的Bean实例化:调用inishBeanFactoryInitialization(beanFactory);
9、其他Bean实例化场景:a.上述1-8对应的Bean实例化依赖其他Bean时,那个Bean同时被实例化(这个在分析createBean()说明);b.延迟实例化的singleton
Bean在第一次通过getBean()主动实例化它时实例化;c.prototype每次调用getBean()时都实例化;其他Scope的在它的生命周期内第一次通过getBean()主动实例化时实例化。
1、BeanDefinitionRegistryPostProcessor实例化:标准BeanFactoryPostProcessor的扩展,BeanFactoryPostProcessor的作用是用来进一步定义注册的BeanDefinition,IoC容器本质就是Bean管理,所以BeanFactoryPostProcessor本身也是Bean,要对BeanFactoryPostProcessor的BeanDefinition进一步定义就通过BeanDefinitionRegistryPostProcessor进行注册,BeanDefinitionRegistryPostProcessor及其子类是Ioc容器最实例化的一类Bean。它们在ConfigurableApplicationContext(ApplicationContext子接口)实现类调用refresh()方法调用invokeBeanFactoryPostProcessors(beanFactory);方法时就被实例化。
2、BeanFactoryPostProcessor实例化:仅次于BeanDefinitionRegistryPostProcessor被实例化。它们在同一个方法进行实例化,只是顺序有先后。
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactorybeanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors)
3、BeanPostProcessorss实例化:BeanPostProcessors是Ioc容器Bean管理的扩展点,定义了Bean实例化前后的回调方法,那它实例化肯定是得比普通的Bean早。ConfigurableApplicationContext.registerBeanPostProcessors(beanFactory)方法负责对BeanPostProcessors进行实例化。实际上实例化BeanPostProcessor的类是PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory,this);
4、MessageSource类型Bean实例化:对应refresh()调用的initMessageSource();
5、ApplicationEventMulticaster(事件广播)类型Bean实例化:负责ApplicationEvent事件广播的bean,refresh()调用initApplicationEventMulticaster();进行实例化。这个Bean是不需要进行配置的,但它通用是在Ioc容器内,而且还是单例的。
6、AbstractApplicationContext类的子类可能会实例化个性化的Bean,refresh()调用onRefresh();方法做这个事情。
7、ApplicationListener类型Bean实例化:ApplicationEventMulticaster负责事件广播,它得注册广播对象,所有ApplicationListener都会在registerListeners();实例化。
1~7对应的Bean都是一些特殊的Bean,除6是由子类决定,其他的都是按照类型进行实例化,实例化调用的方法是:BeanFactory的String[]
getBeanNamesForType(Class<?> type, booleanincludeNonSingletons, boolean allowEagerInit);方法,并且这些Bean设置lazy-init是无效的,设置singleton也是无效的
8、非lazy-init且singleton的Bean实例化:调用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()主动实例化时实例化。
相关文章推荐
- spring IOC容器实例化Bean的方式与RequestContextListener应用
- 获取Spring IOC容器代理的Bean实例的几种方式
- Spring中bean的实例化方式与IOC容器总结
- Strategy 策略模式 在 Spring 开发中的应用 包括事务管理,日志管理(logger),IoC容器根据bean定义的内容实例化等
- spring IOC容器实例化Bean的方式与RequestContextListener应用
- spring IOC容器实例化Bean的方式与RequestContextListener应用
- Spring IOC容器中Bean的实例化过程
- spring IOC容器实例化Bean的方式与RequestContextListener应用
- 传智播客 Spring中bean的实例化方式与IOC容器总结
- spring IOC容器实例化Bean的方式与RequestContextListener应用
- Spring IoC之高级应用--使bean感知容器
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
- Spring容器Bean的实例化方式和声明周期
- 传智播客-spring2.5(1)-IoC与bean的实例化、轻量级和重量级之分
- spring 实例化bean的几种方法
- Spring--初始化IOC容器的几种方式
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
- spring 实例化bean的几种方法
- spring源码学习之路---IOC容器初始化要义之bean定义载入
- Spring动态获取IoC容器中管理的Bean