spring 依赖查找
1、单一类型依赖查找
单一类型依赖查找接口 - BeanFactory
(1)根据 Bean 名称查找:getBean(String)
(2)根据 Bean 类型查找 :getBean(Class)
getBeanProvider(Class)( Spring 5.1 Bean 延迟查找)
(3)根据 Bean 名称 和类型查找:getBean(String,Class)
2、集合类型依赖查找
集合类型依赖查找接口 - ListableBeanFactory
(1)根据 Bean 类型查找
getBeanNamesForType(Class)//获取同类型 Bean 名称列表
getBeansOfType(Class)//获取同类型 Bean 实例列表
(2)通过注解类型查找
getBeanNamesForAnnotation(Class<? extends Annotation>)
getBeansWithAnnotation(Class<? extends Annotation>)
• findAnnotationOnBean(String,Class<? extends Annotation>)
3 、延迟依赖查找
org.springframework.beans.factory.ObjectFactory
org.springframework.beans.factory.ObjectProvider
• 函数式接口 :getIfAvailable(Supplier), ifAvailable(Consumer)
• Stream 扩展 : stream()
4、内建可查找的依赖
(1) AbstractApplicationContext 内建可查找的依赖
Bean 名称 | Bean 实例 | 使用场景 |
---|---|---|
environment | Environment 对象 | 外部化配置以及 Profiles |
systemProperties | java.util.Properties 对象 | Java 系统属性 |
systemEnvironment | java.util.Map 对象 | 操作系统环境变量 |
messageSource | MessageSource 对象 | 国际化文案 |
lifecycleProcessor | LifecycleProcessor 对象 | Lifecycle Bean 处理器 |
applicationEventMulticaster | ApplicationEventMulticaster 对 象 | Spring 事件广播器 |
(2)注解驱动 Spring 应用上下文内建可查找的依赖(部分)
Bean 实例 | 使用场景 |
---|---|
ConfigurationClassPostProcesso r 对象 | 处理 Spring 配置类 |
AutowiredAnnotationBeanPostPro cessor 对象 | 处理@Autowired 以及 @Value注解 |
CommonAnnotationBeanPostProces sor 对象 | (条件激活)处理 JSR-250 注解, 如 @PostConstruct 等 |
PersistenceAnnotationBeanPostP rocessor 对象 | (条件激活)处理 JPA 注解场景 |
5、依赖查找中的经典异常
BeansException 子类型
异常类型 | 触发条件(举例) |
---|---|
NoSuchBeanDefinitionException | 当查找 Bean 不存在于 IoC 容器 时 |
NoUniqueBeanDefinitionException | 类型依赖查找时,IoC 容器存在多 个 Bean 实例 |
BeanInstantiationException | 当 Bean 所对应的类型非具体类时 |
BeanCreationException | 当 Bean 初始化过程中 |
BeanDefinitionStoreException | 当 BeanDefinition 配置元信息非 法时 |
6、ObjectFactory 与 BeanFactory 的区别?
ObjectFactory 与 BeanFactory 均提供依赖查找的能力。 不过 ObjectFactory 仅关注一个或一种类型的 Bean 依赖查找,并 且自身不具备依赖查找的能力,能力则由 BeanFactory 输出。
BeanFactory 则提供了单一类型、集合类型以及层次性等多种依赖查找方式。
7、BeanFactory.getBean 操作是否线程安全?
BeanFactory.getBean 方法的执行是线程安全的,操作过程中会增加互斥锁。