Spring(三)--SpringIOC的依赖查找

Spring依赖查找的根源

  • 在JavaBeans里有依赖查找,BeanContext。在JNDI也有依赖查找,Context类。

SpringIOC单一类型依赖查找接口

  • 根据Bean名称查找: getBean(String)
  • 根据Bean类型查找: 1. 实时查找(getBean(Class))。2.Spring 5.1 Bean延迟查找,getBeanProvider(Class)。

ObjectProvider是Spring提供的一种宽松注入方式,解决了强制依赖以及同类型多个bean的问题。

SpringIOC集合类型依赖查找-ListableBeanFactory

  • 获取同类型的Bean名称列表getBeanNameForType(Class),获取同类型Bean实例列表,getBeanOfType(Class)
  • 获取标注类型Bean名称列表,getBeanNamesForAnnotation(Class),获取标注类型Bean实例列表getBeansWithAnnotation(Class)
  • 指定名称+标注类型获取Bean实例, findAnnotationOnBean(String, Class)

SpringIOC层次依赖查找-HierarchicalBeanFactory

SpringIOC有父容器的概念,下面介绍一些API

  • 获取父BeanFactory: getParentBeanFactory()
  • 层次查找: 1.根据Bean名称查找,containsLocalBean方法实现。2.根据Bean类型查找实例列表, 单一类型: BeanFactoryUtils#beanOfType,集合类型,BeanFactoryUtils#beansOfTypeIncludingAncestors.根据Java注解查找名称列表,BeanFactoryUtils#beanNamesForTypeIncludingAncestors。

SpringIOC的延迟查找

Bean延迟依赖查找接口

  • ObjectFactory
  • ObjectProvider,Spring5对JAVA8特性扩展,提供了函数式接口,Stream扩展。

SpringIOC安全依赖查找

安全指的找不到也不会抛异常
Spring(三)--SpringIOC的依赖查找_第1张图片

内建可查找的依赖

Spring(三)--SpringIOC的依赖查找_第2张图片

Spring(三)--SpringIOC的依赖查找_第3张图片
Spring(三)--SpringIOC的依赖查找_第4张图片

Spring依赖查找中经典异常

Spring(三)--SpringIOC的依赖查找_第5张图片

面试题

  • ObjectFactory与BeanFactory的区别

ObjectFactory与BeanFactory均提供依赖查找的能力,不过ObjectFactory仅关注一个或一种类型的Bean依赖查找,并且本身不具备依赖查找的能力,能力由BeanFactory输出,BeanFactory则提供单一类型,集合类型以及层次性等多种以来查找方式。ObjectFactory的经典实现ObjectFactoryCreatingFactoryBean就是底层由BeanFactory提供的支持。

  • BeanFactory.getBean操作是否线程安全

BeanFactory.getBean方法的执行是线程安全的,使用了synchronize关键字对definitionMap加锁。

你可能感兴趣的:(Spring,SpringBoot及微服务,spring,java)