Spring依赖查找和注入

281 阅读3分钟

作为一名Java工程师,能够熟练使用Spring,基本上已经成为一个硬性条件了,不管你去哪边面试,或多或少都会被问及到相关的知识。尤其在如今经济形势不太好的情况下,Java工程师市场明显供大于求,各大公司对应聘者的条件明显严苛了不少,这也要求应聘者不仅仅是使用过Spring的框架,还需要理解Spring的系统设计和原理。

当然Spring现在已经发展的如日中天, 只要你是Java工程师,你从事的工作基本都逃不了Spring的包围。

image.png

Spring搭建的万丈高楼,也在于它坚固的地基,IoC容器就是坚固地基中必不可少的一部分,而对Bean的依赖查找和依赖注入就是IoC容器非常重要的一部分。

1、依赖查找和依赖注入对比

类型依赖处理便利性侵入性API依赖性可读性
依赖查找主动获取繁琐侵入业务逻辑依赖容器API可读性良好
依赖注入被动获取便利低侵入不依赖一般

在我们业务正常使用的场景中,大部分都会直接基于注解的方式进行依赖注入,不会主动进行依赖查找。

2、依赖查找的方式

  • 根据Bean名称查找、查找接口BeanFactory

    • 实时查找 getBean(String)
    • 延迟查找 接口ObjectFactory、ObjectProvider. getBeanProvider(Class) getBeanProvider(ResolvableType)
  • 根据Bean类型查找

    • 单个Bean对象 getBean(Class)
    • 集合Bean对象 ListableBeanFactory getBeanNamesForType(Class)
  • 根据名称+类型查找 getBean(String, Class)

  • 基于Java注解查找

    • 单个Bean对象 findAnnotationOnBean(String, Class)
    • 集合Bean对象 getBeanNamesForAnnotation(Class) getBeansWithAnnotation(Class)

单一类型查找:

  • BeanFactory#getBean
  • ObjectFactory#getObject
  • ObjectProvider#getIfAvailable

集合类型查找:

  • ListableBeanFactory#getBeansOfType
  • ObjectProvider#stream

3、依赖注入的方式

3.1、依赖注入的模式和类型

  • 手动模式- 配置或者编程的方式,提前安排注入规则

    • XML 资源配置元信息
    • Java 注解配置元信息
    • API 配置元信息
  • 自动模式-实现方提供依赖自动关联的方式,按照内建的注入规则

    • Autowiring(自动绑定)

3.2、依赖注入类型

  • Setter方法
  • 构造器
  • 字段注入
  • 方法注入
  • 接口回调 (BeanFactoryAware)

3.3、自动绑定模式

模式说明
no默认值,未激活Autowiring, 需要手动指定依赖注入对象
byName根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性
byType根据被注入属性的类型作为依赖类型进行查找,并将对象设置到属性
constructor特殊byType类型,用于构造器参数

3.4、限定注入

  • 使用注解@Qualifier限定
    • 通过Bean名称限定
    • 通过分组限定

3.5、延迟注入

  • 使用API ObjectFactory延迟注入。单一类型和集合类型
  • 使用API ObjectProvider延迟注入。单一类型和集合类型

4、总结

Spring 依赖查找和依赖注入是Spring Framework IOC容器的必知项。Bean的来源,注入,查找,创建和销毁等等,这个都是Spring后期演进的基础。这个作为Spring的开篇,后期继续跟进