作为一名Java工程师,能够熟练使用Spring,基本上已经成为一个硬性条件了,不管你去哪边面试,或多或少都会被问及到相关的知识。尤其在如今经济形势不太好的情况下,Java工程师市场明显供大于求,各大公司对应聘者的条件明显严苛了不少,这也要求应聘者不仅仅是使用过Spring的框架,还需要理解Spring的系统设计和原理。
当然Spring现在已经发展的如日中天, 只要你是Java工程师,你从事的工作基本都逃不了Spring的包围。
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的开篇,后期继续跟进