Spring bean

Spring 核心组件装配流程解析

  • IoC (Inverse of Control, 控制反转)
  • DI (Dependency Injection, 依赖注入)

关于spring容器管理Bean的过程以及加载模式:

代码:

Resource resource = new ClassPathResource("applicationContext.xml");
DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
BeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
beanDefinitionReader.loadBeanDefinitions(resource);
Member member = (Member) defaultListableBeanFactory.getBean("member");
  • 1.需要将 bean 的定义信息声明在 Spring 的配置文件当中。
  • 2.需要通过 Spring 抽象出的各种 Resource 来指定对应的配置文件。
  • 3.需要显式声明一个 Spring 工厂,该工厂用来掌控我们在配置文件中所声明的各种 bean 以及 bean 之间的依赖关系与注入关系
  • 4.需要定义一个配置信息读取器,该读取器用来读取之前所定义的 bean 配置文件信息
  • 5.读取器的作用是读取我们所声明的配置文件信息,并且将读取后的信息装配到之前所声明的工厂当中。
  • 6.需要将读取器与工厂及资源对象进行相应的关联处理
  • 7.工厂所管理的全部对象装配完毕,可以供客户端直接调用,获取客户端想要使用的各种 bean 对象

Spring 对于 bean 管理的核心组件:

  • 1.资源抽象
  • 2.工厂
  • 3.配置信息读取器

BeanFactory是spring Bean工厂最顶层的抽象
关于spring Bean实例的注册流程

  1. 定义好spring的配置文件。
  2. 通过Resource对象将Spring配置文件进行抽象,抽象成一个具体的Resource对象〈如ClassPathResource)。
  3. 定义好将要使用的Bean工厂(各种BeanFactory)。
  4. 定义好xmlBeanDefinitionReader对象,并将工厂对象作为参数传递进去,从而构建好二者之间的关联关系。
  5. 通过xmlBeanDefinitionReader对象读取之前所抽取出的Resource对象。
  6. 流程开始进行解析。
  7. 针对 XML 文件进行各种元素以及元素属性的解析,这里面,真正的解析是通过BeanDefinitionParserDelegate对象来完成的(委托模式)
  8. 通过BeanDefinitionParserDelegate对象在解析XML文件时,又使用到了模板方法设计模式(pre,process,post)。
  9. 当所有的bean标签元素都解析完毕后,开始定义一个BeanDefinition对象,该对象是一个非常重要的对象,里面容纳了一个Bean相关的所有属性
  10. BeanDefinition对象创建完毕后,Spring又会创建一个BeanDefinitionHolder对象来持有这个BeanDeEinition对象。
  11. BeanDefinitionHolder对象主要包含两部分内容: beanName与BeanDefinition。
  12. 工厂会将解析出来的Bean信息存放到内部的一个ConcurrentHashMap中,该Map的键是beanName(唯一),值是BeanDefinition对象
  13. 调用Bean解析完毕的触发动作,从而触发相应的监听器的方法的执行(使用到了观察者模式)

关于spring Bean的创建流程

  1. Spring所管理的Bean实际上是缓存在一个ConcurrentHashMap中的(singleton0bjects对象中)。
  2. 该对象本质上是一个key-value对的形式,key指的是bean的名字(id) , value是一个object对象,就是所创建的bean对象。
  3. 在创建Bean之前,首先需要将该Bean的创建标识指定好,表示该bean已经或是即将被创建,目的是增强缓存的效率。
  4. 根据bean的scope属性来确定当前这个bean是一个singleton还是一个prototype的bean,然后创建相应的对象。5. 无论是singleton还是prototype的bean."其创建的过程是—致的。
  5. 通过Java反射机制来创建Bean的实例,在创建之前需要检查构造方法的访问修饰符,如果不是public的,则会调用setAccessible(true)
    方法来突破Java的语法限制,使得可以通过非public构造方法来完成对象实例的创建。
  6. 当对象创建完毕后,开始进行对象属性的注入。
  7. 在对象属性注入的过程中,Spring除去使用之前通过BeanDefinition对象获取的Bean信息外,还会通过反射的方式获取到上面所创建的pean中的真实属性信息(还包括一个class属性,表示该Bean所对应的class类型)
  8. 完成Bean属性的注入(或者抛出异常).
  9. 如果Bean是一个单例的,那么将所创建出来的Bean添加到singletonObjects对象中(缓存中),供程序后续再次使用。

基于注解与基于XML配置的Spring Bean在创建时机上存在的唯一的不同之处:

  1. 基于XML配置的方式,Bean对象的 创建是在程序首次从工厂之后获取改对象时才创建的
  2. 基于注解配置的方式,Bean对象的创建是在注解处理器解析相应的@Bean注解时调用了该注解所修饰的方法,当该方法执行后,相应的对象自然就已经被创建出来了,这时,Spring就会将改对象纳入到工厂的管理范围之列,当我们首次尝试从工厂之后获取该Bean对象时,这时,该Bean对象实际上已经完成了创建并已被纳入到工厂的管理范围之内
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值