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