Spring IoC 依赖查找
2022-07-05 14:20:59 5 举报
AI智能生成
Spring依赖查找相关知识点
作者其他创作
大纲/内容
单一类型依赖查找接口 - BeanFactory
根据 Bean 名称查找
getBean(String)
Spring 2.5 覆盖默认参数:getBean(String,Object...)
根据 Bean 类型查找
Bean 实时查找
Spring 3.0 getBean(Class)
Spring 4.1 覆盖默认参数:getBean(Class,Object...)
Spring 5.1 Bean 延迟查找
getBeanProvider(Class)
getBeanProvider(ResolvableType)
根据 Bean 名称 + 类型查找:getBean(String,Class)
集合类型依赖查找接口 - ListableBeanFactory
根据 Bean 类型查找
获取同类型 Bean 名称列表
getBeanNamesForType(Class)
Spring 4.2 getBeanNamesForType(ResolvableType)
获取同类型 Bean 实例列表
getBeansOfType(Class) 以及重载方法
通过注解类型查找
Spring 3.0 获取标注类型 Bean 名称列表
getBeanNamesForAnnotation(Class<? extends Annotation>)
Spring 3.0 获取标注类型 Bean 实例列表
getBeansWithAnnotation(Class<? extends Annotation>)
Spring 3.0 获取指定名称 + 标注类型 Bean 实例
findAnnotationOnBean(String,Class<? extends Annotation>)
层次性依赖查找接口 - HierarchicalBeanFactory
双亲 BeanFactory:getParentBeanFactory()
层次性查找
根据 Bean 名称查找
基于 containsLocalBean 方法实现
该方法效果为查询当前 beanFactory 是否有该名称的 Bean
根据 Bean 类型查找实例列表
单一类型
BeanFactoryUtils#beanOfTypeIncludingAncestors
集合类型
BeanFactoryUtils#beansOfTypeIncludingAncestors
根据 Java 注解查找名称列表
BeanFactoryUtils#beanNamesForTypeIncludingAncestors
Bean 延迟依赖查找接口
org.springframework.beans.factory.ObjectFactory
org.springframework.beans.factory.ObjectProvider
Spring 5 对 Java 8 特性扩展
函数式接口
getIfAvailable(Supplier)
ifAvailable(Consumer)
Stream 扩展 - stream()
安全依赖查找
单一类型查找
BeanFactory#getBean
不安全
ObjectFactory#getObject
不安全
ObjectProvider#getIfAvailable
安全
集合类型查找
ListableBeanFactory#getBeansOfType
安全
ObjectProvider#stream
安全
层次性依赖查找
注意:层次性依赖查找的安全性取决于其扩展的单一或集合类型的 BeanFactory 接口
DefaultListableBeanFactory 实现了单一类型、集合类型、层次性类型的复合查找
内建可查询依赖
AbstractApplicationContext 内建可查找的依赖
注解驱动 Spring 应用上下文内建可查找的依赖(部分)
注解驱动 Spring 应用上下文内建可查找的依赖(续)
依赖查找中的经典异常
NoSuchBeanDefinitionException
触发条件
当查找 Bean 不存在于 IoC 容器 时
场景举例
BeanFactory#getBean ObjectFactory#getObject
NoUniqueBeanDefinitionException
触发条件
类型依赖查找时,IoC 容器存在多 个 Bean 实例
场景举例
BeanFactory#getBean(Class)
BeanInstantiationException
触发条件
当 Bean 所对应的类型非具体类时
场景举例
BeanFactory#getBean
BeanCreationException
触发条件
当 Bean 初始化过程中
场景举例
Bean 初始化方法执行异常 时
BeanDefinitionStoreException
触发条件
当 BeanDefinition 配置元信息非 法时
场景举例
XML 配置资源无法打开时
面试题
ObjectFactory与BeanFactory的区别
ObjectFactory
ObjectFactory继承自ObjectProvider,具有延迟依赖查找的能力
BeanFactory时调用代理对象的getBean方法,代理对象为BeanFactory,所以,ObjectFactory实际上没有依赖查找的能力
BeanFactory
BeanFacotry具有单一类型查找,集合类型查找,复合类型查找的复合型容器
BeanFactory#getObject操作线程是否安全
安全
原因是:底层采用了ConcurrentHashMap,存取都是安全的,第二点创建对象的时候采用了互斥锁
源码
Spring 依赖查找与注入在来源上的区别?
0 条评论
下一页