Spring(06)IOC 依赖注

Posted binarylei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring(06)IOC 依赖注相关的知识,希望对你有一定的参考价值。

Spring(06)IOC 依赖注入

Spring 核心编程思想目录:https://www.cnblogs.com/binarylei/p/12290153.html

1. 依赖注入的模式和类型

1.1 依赖注入模式

  • 手动模式- 配置或者编程的方式,提前安排注入规则
    • XML 资源配置元信息
    • Java 注解配置元信息
    • API 配置元信息
  • 自动模式- 实现方提供依赖自动关联的方式,按照內建的注入规则
    • Autowiring(自动绑定):no、byName、byType、constructor

1.2 依赖注入类型

依赖注入类型 配置元数据举例
Setter 方法 <proeprty name="user" ref="userBean" />
构造器 <constructor-arg name="user" ref="userBean" />
字段 @Autowired User user;
方法 @Autowired public void user(User user) { ... }
接口回调 class MyBean implements BeanFactoryAware { ... }

2. 自动绑定(Autowiring)

3. 自动绑定(Autowiring)模式

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

参考枚举:org.springframework.beans.factory.annotation.Autowire

4. 自动绑定(Autowiring)限制和不足

https://docs.spring.io/spring/docs/5.2.2.RELEASE/spring-framework-reference/core.html#beans-autowired-exceptions

5. Setter 方法依赖注入

  • 手动模式
    • XML 资源配置元信息
    • Java 注解配置元信息
    • API 配置元信息
  • 自动模式
    • byName
    • byType

6. 构造器依赖注入

  • 手动模式
    • XML 资源配置元信息
    • Java 注解配置元信息
    • API 配置元信息
  • 自动模式
    • constructor

7. 字段注入

  • 手动模式 - Java 注解配置元信息
    • @Autowired
    • @Resource
    • @Inject(可选)

8. 方法注入

  • 手动模式 - Java 注解配置元信息
    • @Autowired
    • @Resource
    • @Inject(可选)
    • @Bean

9. 回调注入

內建接口 说明
BeanFactoryAware 获取 IoC 容器 - BeanFactory
ApplicationContextAware 获取 Spring 应用上下文 - ApplicationContext 对象
EnvironmentAware 获取 Environment 对象
ResourceLoaderAware 获取资源加载器对象- ResourceLoader
BeanClassLoaderAware 获取加载当前 Bean Class 的 ClassLoader
BeanNameAware 获取当前 Bean 的名称
MessageSourceAware 获取 MessageSource 对象,用于 Spring 国际化
ApplicationEventPublisherAware 获取 ApplicationEventPublishAware 对象,用于 Spring 事件
EmbeddedValueResolverAware 获取 StringValueResolver 对象,用于占位符处理

10. 依赖注入类型选择

11. 基础类型注入

  • 原生类型(Primitive ): boolean、byte、char、short、int 、float、long、double
  • 标量类型(Scalar ): Number、Character、Boolean、Enum、Locale、Charset、Currency、Properties、UUID
  • 常规类型(General ): Object、String、Timezone、Calendar、Optional
  • Spring 类型:Resource、Inputsource、Formatter

12. 集合类型注入

  • 数组类型(Array ):原生类型、标量类型、常规类型、 Spring 类型
  • 集合类型(Collection )
    • Collection:List、Set(Sortedset、 NavigableSet、 EnumSet)
    • Map:Properties

13. 限定注入

  • 使用注解 @Qualifier 限定
    • 通过 Bean 名称限定
    • 通过分组限定
  • 基于注解 @Qualifier 扩展限定
    • 自定义注解 - 如 Spring Cloud @Loadbalanced

14. 延迟依赖注入

  • 使用 Objectfactory 延迟注入
    • 单一类型
    • 集合类型
  • 使用 Objectprovider 延迟注入(推荐)
    • 单一类型
    • 集合类型

15. 依赖处理过程

  • 入口 - DefaultListableBeanFactory#resolveDependency
  • 依赖描述符 - DependencyDescriptor
  • 自定绑定候选对象处理器 - AutowireCandidateResolver

16. @Autowired 注入原理

@Autowired 注入过程:

  • 元信息解析
  • 依赖查找
  • 依赖注入(字段、方法)

@Autowired 不支持 Java 原生类型注入,所以有了 @Value 注解

Spring EL 表达式:https://blog.csdn.net/u011305680/article/details/80271423

17. JSR-330 @Inject 注入原理

18. Java 通用注解注入原理

19. 自定义依赖注入注解

20. 面试题精选

以上是关于Spring(06)IOC 依赖注的主要内容,如果未能解决你的问题,请参考以下文章

spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定

Spring框架IOC和AOP的实现原理

Spring IOC 和 DI

Spring随笔(06)

Spring IOC源代码具体解释之容器依赖注入

Spring Ioc 依赖查找