Spring--SpringIOC的依赖查找

Posted jazon@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<? extends Annotation>),获取标注类型Bean实例列表getBeansWithAnnotation(Class<? extends Annotation>)
  • 指定名称+标注类型获取Bean实例, findAnnotationOnBean(String, Class<? extends Annotation>)

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依赖查找中经典异常

面试题

  • ObjectFactory与BeanFactory的区别

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

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

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

以上是关于Spring--SpringIOC的依赖查找的主要内容,如果未能解决你的问题,请参考以下文章

Spring--SpringIOC依赖来源

c# 字符串 中查找字符,判断是否包含字符串

Spring AOP:Exception encountered during context initialization - cancelling refresh attempt: org.spr

Spring 如何解决循环依赖的问题

Spring依赖注入:注解注入总结

logback的使用和原理