Spring 依赖查找 层次性依赖查找 安全依赖查找特性

作者: Spring 开发者

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)
  • Spring 3.0 获取标注类型 Bean 实例列表
    • getBeansWithAnnotation(Class)
  • Spring 3.0 获取指定名称+ 标注类型 Bean 实例
    • findAnnotationOnBean(String,Class)

      层次性依赖查找

      层次性依赖查找接口- HierarchicalBeanFactory
  • 双亲 BeanFactory:getParentBeanFactory()
  • 层次性查找
  • 根据 Bean 名称查找
    • 基于 containsLocalBean 方法实现
  • 根据 Bean 类型查找实例列表
    • 单一类型:BeanFactoryUtils#beanOfType
    • 集合类型: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 接口

    内建可查找的依赖

    AbstractApplicationContext 内建可查找的依赖
    | Bean                        | 名称 Bean                        | 实例使用场景            |
    | --------------------------- | -------------------------------- | ----------------------- |
    | environment                 | Environment 对象                 | 外部化配置以及 Profiles |
    | systemProperties            | java.util.Properties 对象        | Java 系统属性           |
    | systemEnvironment           | java.util.Map 对象               | 操作系统环境变量        |
    | messageSource               | MessageSource 对象               | 国际化文案              |
    | lifecycleProcessor          | LifecycleProcessor 对象          | Lifecycle Bean 处理器   |
    | applicationEventMulticaster | ApplicationEventMulticaster 对象 | Spring 事件广播器       |
    
    注解驱动 Spring 应用上下文内建可查找的依赖(部分)
    | Bean 名称                                                                       | Bean 实例                                   | 使用场景                                              |
    | ------------------------------------------------------------------------------- | ------------------------------------------- | ----------------------------------------------------- |
    | org.springframework.context.annotation.internalConfigurationAnnotationProcessor | ConfigurationClassPostProcessor 对象        | 处理 Spring 配置类                                    |
    | org.springframework.context.annotation.internalAutowiredAnnotationProcessor     | AutowiredAnnotationBeanPostProcessor 对象   | 处理@Autowired 以及@Value 注解                        |
    | org.springframework.context.annotation.internalCommonAnnotationProcessor        | CommonAnnotationBeanPostProcessor 对象      | (条件激活)处理 JSR-250 注解,如@PostConstruct 等    |
    | org.springframework.context.event.internalEventListenerProcessor                | EventListenerMethodProcessor 对象           | 处理标注@EventListener 的 Spring 事件监听方法         |
    | org.springframework.context.event.internalEventListenerFactory                  | DefaultEventListenerFactory 对象            | @EventListener 事件监听方法适配为 ApplicationListener |
    | org.springframework.context.annotation.internalPersistenceAnnotationProcessor   | PersistenceAnnotationBeanPostProcessor 对象 | (条件激活)处理 JPA 注解场景                         |
    

    依赖查找中的经典异常

    BeansException 子类型
    | 异常类型                        | 触发条件(举例)                           | 场景举例                                   |
    | ------------------------------- | ------------------------------------------ | ------------------------------------------ |
    | NoSuchBeanDefinitionException   | 当查找 Bean 不存在于 IoC 容器时            | BeanFactory#getBeanObjectFactory#getObject |
    | NoUniqueBeanDefinitionException | 类型依赖查找时,IoC 容器存在多个 Bean 实例 | BeanFactory#getBean(Class)                 |
    | BeanInstantiationException      | 当 Bean 所对应的类型非具体类时             | BeanFactory#getBean                        |
    | BeanCreationException           | 当 Bean 初始化过程中                       | Bean 初始化方法执行异常时                  |
    | BeanDefinitionStoreException    | 当 BeanDefinition 配置元信息非法时         | XML 配置资源无法打开时                     |
    

更多推荐

更多
  • Spring Boot实战-00开篇词从零开始:为什么要学习SpringBoot? 你为什么需要学习这门课程?,这门课程是如何设计的?,讲师寄语, 你好,我是鉴湘,有 10 年以上大型 Java EE 和分布架进行系统开发和维护有着丰富的实践经验。 在我的从业生涯中,曾经带过不少项目,以我所带领的电商项目开发团队为例
  • Spring Boot实战-04定制配置:如何创建和管理自定义的配置信息? 如何在应用程序中嵌入系统配置信息?,如何创建和使用自定义配置信息?,如何组织和整合配置信息?,如何覆写内置的配置类?,小结与预告,03 讲中,我们介绍了 Spring Boot ...
  • Spring Boot实战-09数据抽象:SpringData如何对数据访问过程进行统一抽象? Repository 接口及实现,多样化查询支持,Spring Data 中的组件,小结与预告, 事实上,JdbcTemplate 是相对偏底层的一个工具类,作为系统开发最重要的基础功能之一,族中另一个重要成员 Spring Data
  • Spring Boot实战-13服务调用:如何正确理解RestTemplate远程调用实现原理? 初始化 RestTemplate 实例,RestTemplate 核心执行流程,从源码解析到日常开发,小结与预告, 在 12 讲中,我们详细描述了如何使用 RestTemplate 访问 HTTP 端点的使用方法,它涉及 Res中的这些
  • Spring Boot实战-12服务调用:如何使用RestTemplate消费RESTful服务? 使用 RestTemplate 访问 HTTP 端点,实现 SpringCSS 案例中的服务交互,小结与预告,11 讲我们介绍了如何使用 Spring Boot 构建 RESTful 风格 Web 服务的实现方法,而 S 服务的构建后,
  • Spring Boot实战-结束语以终为始:SpringBoot总结和展望 Spring Boot 的创新性,Spring Boot 课程总结,Spring Boot 的发展和演进, 终于到了课程的最后一讲啦,这一讲我们将对整个 Spring Boot 课程进行总结。 Spring Boring Boot 提供
  • Spring Boot实战-08数据访问:如何剖析JdbcTemplate数据访问实现原理? 从模板方法模式和回调机制说起,JDBC API 到 JdbcTemplate 的演变,JdbcTemplate 源码解析,从源码解析到日常开发,小结与预告,07 讲中,我们介绍了使用 JdbcTemplate ...
  • Spring Boot实战-03多维配置:如何使用SpringBoot中的配置体系? 创建第一个 Spring Boot Web 应用程序,Spring Boot 中的配置体系,小结与预告, 配置体系是基于 Spring Boot 框架开发应用程序的基础,而自动配置也是该框架的核心功能之一。今eb 应用程序开始吧。 创
  • Spring Boot实战-21指标定制:如何实现自定义度量指标和Actuator端点? Actuator 中的度量指标,自定义 Actuator 端点,小结与预告,20 讲中我们引入了 Spring Boot Actuator 组件来满足 这一讲我们继续讨论如何扩展 Actuator 端点,但更多关注与度量指标相关的内容
  • Spring Boot实战-02案例驱动:如何剖析一个SpringWeb应用程序? Spring MVC VS Spring Boot,剖析一个 Spring Web 应用程序,案例驱动:SpringCSS,小结与预告, 在 01 讲中,我们提到 Spring 家族具备很多款开源框架,开发人员可以基于这些开发框架实现各种 ...
  • 近期文章

    更多
    文章目录

      推荐作者

      更多