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

Bean实例化的几种场景

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

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

[java] view plain copy

  1. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(
  2. 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);

[java] view plain copy

  1. protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
  2. // 有容器转换服务bean时先实例化这种Bean
  3. if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
  4. beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
  5. beanFactory.setConversionService(
  6. beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
  7. }
  8. // 实例化LoadTimeWeaverAware类型Bean
  9. String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
  10. for (String weaverAwareName : weaverAwareNames) {
  11. getBean(weaverAwareName);
  12. }
  13. // 停止使用临时类加载器
  14. beanFactory.setTempClassLoader(null);
  15. // 缓存容器中所有注册的BeanDefinition元数据,以防被修改
  16. beanFactory.freezeConfiguration();
  17. // 实例化剩余的所有非lazy-init singleton Bean
  18. beanFactory.preInstantiateSingletons();
  19. }

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

时间: 2024-11-14 12:38:11

Spring-- Ioc 容器Bean实例化的几种场景的相关文章

Spring IoC容器管理Action

Spring IoC容器管理Action有两种方式:DelegatingRequestProcessor.DelegatingActionProxy 不管采用哪一种方式,都需要随应用启动时创建ApplicationContext实例,由Struts负责在应用启动时创建ApplicationContext实例.Struts中提供了PlugIn的扩展点,可在应用启动和关闭时,创建或销毁某些资源. 使用ContextLoaderPluIn创建了ApplicationContext实例后,关键是如何将A

Spring—IOC容器如何实例话Bean

前言  传统应用程序可以通过new和反射的方式来实例化Bean.而Spring Ioc容器则需要根据配置元数据使用反射机制来创建Bean.在Spring Ioc容器中根据Bean创建Bean实例有以下几种方式. (1).使用构造器实例化Bean (2).使用静态工厂实例化Bean (3).使用实例工厂实例化Bean 一.使用构造器实例化Bean:Spring IoC容器能使用默认空构造器也能使用有参数构造器两种方式创建Bean. (a).使用空构造器进行定义,使用此种方式,class属性指定的类

介绍 Spring IoC 容器和 bean

简介 本章涵盖了 Spring Framework实现控制翻转 (IoC) 的原则. IoC 有时也被称为依赖注入 (DI).这是一个对象定义他们依赖的过程,其中对象之间的相关性,也就是说,它们一起工作,只能通过构造函数参数,参数工厂方法或设置在其构造后的对象实例或者是从一个工厂方法返回的对象实例的属性上.容器在创建的 bean 注入这些依赖.这个过程是根本的反转,因此称为控制反转(IoC),bean 本身通过直接构造类,或作为 Service Locator(服务定位器)模式的机制,来控制其依

Spring IOC 容器源码分析 - 创建单例 bean 的过程

1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去创建,而是从缓存中获取.如果某个 bean 还未实例化,这个时候就无法命中缓存.此时,就要根据 bean 的配置信息去创建这个 bean 了.相较于getBean(String)方法的实现逻辑,创建 bean 的方法createBean(String, RootBeanDefinition, Obj

Spring框架参考手册翻译——第三部分 核心技术 6.1 Spring IoC容器和bean的介绍

第三部分 核心技术 这部分参考文档涵盖的这些技术是Spring Framework绝对重要的. 其中最重要的要数Spring框架的控制反转(IoC)容器.深入剖析Spring框架IoC容器之后,紧接着要介绍的是Spring面向切面编程(AOP)技术.Spring框架拥有自己的AOP框架,从概念上很容易理解,并且成功地解决了AOP在Java企业级编程中80%的痛点需求. 还提供了Spring与AspectJ(目前在功能上最丰富,在Java企业领域最成熟的AOP实现)的集成. 第六章,IoC容器 第

[Spring实战系列](6)配置Spring IOC容器的Bean

1. 简介 Spring提供了一个强大的IOC容器来管理组成应用的bean.为了利用容器服务,必须配置运行于Spring IOC容器中的Bean. 2. 解决方案 你可以通过XML文件,属性文件,注释甚至API来设置Spring IOC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能将其分割到多个配置文件中. 3. 创建Spring配置 正如前面所讲的,

Spring bean管理器 bean实例化的三种方式

bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.UserService; public class UserService { public UserService() { //该方法是无参方法 } public void AddUser(){ System.out.println("Add........................."

详解Spring IoC容器

一.Spring IoC容器概述 1.依赖反转(依赖注入):依赖对象的获得被反转了. 如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的设计是非常不利的. 在Spring中,IoC容器是实现依赖控制反转这个模式的载体,它可以在对象生成或者初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.这种依赖是可以递归的,对象被逐层注入. 关于如何反转对依赖的控制,把控制权从具体业务对象中转交到平

对spring IOC容器、DI的理解

1.IOC是什么? IOC(控制反转)是一种管理bean的容器,它的本质是对象工厂(接口). 在应用程序中的组件需要获取资源时,传统的方式是组件主动从容器中获取所需的资源,在这种模式下,开发人员需要知道具体容器中资源的获取方式,增加了学习成本,降低了开发效率. 反转控制思想改由容器主动将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接受资源的方法即可. 2.IOC容器在spring中的实现 (1)在通过IOC容器读取Bean实例前,先需要将IOC容器本身实例化. (