5 - Spring IoC 依赖查找

本文深入解析Spring框架中依赖查找的概念及其实现方式,包括单一类型、集合类型和层次性依赖查找等,同时还介绍了延迟依赖查找、安全依赖查找及内建可查找依赖等内容。

1. 依赖查找的前世今生

1.1 单一类型依赖查找

  • JNDI - javax.naming.Context#lookup
  • JavaBeans - java.beans.beancontext.BeanContext;

1.2 集合类型依赖查找

  • JavaBeans - java.beans.beancontext.BeanContext;

1.3 层次性依赖查找

  • JavaBeans - java.beans.beancontext.BeanContext;

2. 单一类型依赖查找

单一类型依赖查找接口 - 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)
 ObjectProvider<User> userObjectProvider = applicationContext.getBeanProvider(User.class);
  • 根据 Bean 名称 + 类型查找:getBean(String,Class)

3.集合类型依赖查找:如何查找已知类型多个Bean集合?

集合类型依赖查找接口 - 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>)

4. 层次性依赖查找:依赖查找也有双亲委派?

层次性依赖查找接口 - HierarchicalBeanFactory

  • 双亲 BeanFactory:getParentBeanFactory()
  • 层次性查找
    • 根据 Bean 名称查找
      • 基于 containsLocalBean 方法实现
    • 根据 Bean 类型查找实例列表
      • 单一类型:BeanFactoryUtils#beanOfType
      • 集合类型:BeanFactoryUtils#beansOfTypeIncludingAncestors
    • 根据 Java 注解查找名称列表
      • BeanFactoryUtils#beanNamesForTypeIncludingAncestors

5.延迟依赖查找:非延迟初始化Bean也能实现延迟查找?

Bean 延迟依赖查找接口

  • org.springframework.beans.factory.ObjectFactory
  • org.springframework.beans.factory.ObjectProvider
    • Spring 5 对 Java 8 特性扩展
      • 函数式接口
        getIfAvailable(Supplier)
        ifAvailable(Consumer)
      • Stream 扩展 - stream()

6.安全依赖查找

所谓安全指的是如果找不到依赖也不报错。
在这里插入图片描述
注意:层次性依赖查找的安全性取决于其扩展的单一或集合类型的 BeanFactory 接口

7. 内建可查找的依赖:哪些Spring IoC容器内建依赖可供查找?

AbstractApplicationContext 内建可查找的依赖
在这里插入图片描述

8.| 内建可查找的依赖:哪些Spring IoC容器内建依赖可供查找?

注解驱动 Spring 应用上下文内建可查找的依赖(部分)
在这里插入图片描述

9.内建可查找的依赖

注解驱动 Spring 应用上下文内建可查找的依赖(续)
在这里插入图片描述

10.依赖查找中的经典异常

BeansException 子类型
在这里插入图片描述

11.面试题

  • ObjectFactory 与 BeanFactory 的区别?
  • BeanFactory.getBean 操作是否线程安全?
  • Spring 依赖查找与注入在来源上的区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值