Spring IoC 依赖注入
本章节代码演示: 在dependency-injection模块
一、依赖注入的模型和类型
-
手动模式 - 配置或者编程的方式,提前安排注入规则
- XML资源配置元信息
- Java注解配置元信息
- Java API配置元信息
-
自动模式 -实现方提供依赖自动关联的方式,按照内建的注入规则
- Autowiring(自动绑定 )
-
依赖注入类型
依赖注入类型 配置元数据举例 Setter方法 构造器 字段 @Autowired User user; 方法 @Autowired public void user(User user){…} 回调 Class MyBean implements BeanFactoryAware{…}
二、自动绑定(Autowiring)
- 优点
- 可以有效的减少一些属性或构造器参数的一个设定
- 能够更新配置
三、自动绑定模式(Autowiring Mode)
- AutowiringMode
参考枚举:org.springframework.beans.factory.annotation.Autowire
模式 说明 no 默认值,未激活Autowiring,需要手动注入依赖 byName 根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性 byType 根据被注入属性的类型作为依赖类型查找,并将对象设置到该属性 constructor 特殊byType类型,用于构造器参数
四、自动绑定(Autowiring)限制和不足
五、Setter方法依赖注入
- 实现方法
-
手动模式
-
XML配置元信息
参考代码:*com.forjson.spring.dependency.injection.XmlDependencySetterInjectionDemo
-
Java注解配置元信息
参考代码:com.forjson.spring.dependency.injection.XmlDependencySetterInjectionDemo
-
API配置元信息
参考代码:com.forjson.spring.dependency.injection.ApiDependencySetterInjectionDemo
-
-
自动模式
参考代码:com.forjson.spring.dependency.injection.AutowiringDependencySetterInjectionDemo
- byName
- byType
-
六、构造器依赖注入
实现方法
- 手动模式
-
XML配置元信息
参考代码: com.forjson.spring.dependency.injection.XmlDependencyConstructorInjectionDemo
-
Java注解配置元信息
参考代码:com.forjson.spring.dependency.injection.AnnotationDependencySetterInjectionDemo
-
API配置元信息
参考代码:com.forjson.spring.dependency.injection.ApiDependencySetterInjectionDemo
-
七、字段注入
-
@Autowire 注入模式
参考代码:com.forjson.spring.dependency.injection.AnnotationDependencyFieldInjectionDemo
-
@Resource 注入模式
com.forjson.spring.dependency.injection.AnnotationDependencyResourceFieldInjectionDemo
八、方法注入
参考代码: com.forjson.spring.dependency.injection.AnnotationDependencyMethodInjectionDemo
九、回调注入
参考代码演示: com.forjson.spring.dependency.injection.AwareInterfaceAnnotationDependencyInjectionDemo
-
Aware系列回调注入
内建接口 说明 BeanFactoryAware 获取IOC容器-BeanFactry ApplicationContextAware 获取Spirng应用上下文-ApplicationContext对象 EnvironmentAware 获取Environment对象 ResourceLoaderAware 获取资源加载对象-ResourceLoader BeanClassLoaderAware 获取当前Bean Class的ClassLoader BeanNameAware 获取当前Bean Class的名称 MessageSourceAware 获取MessageSource对象,用于Spring国际化 ApplicationEventPublisherAware 获取ApplicationEventPublisher对象,用于Spring事件 EmbeddedValueResolverAware 获取StringValueResolver对象,用于占位符处理
十、依赖注入类型选择
- 注入类型
- 低依赖:构造器注入
- 多依赖:Setter方法注入
- 便利性:字段注入
- 声明类:方法注入
十一、基础类型注入
参考代码演示: com.forjson.spring.dependency.injection.BasicTypeInjectionDemo
- 基础类型:
- 原生类型(primitive): boolean、byte、char、short、int、float、long、double
- 标量类型(Scalar): Number、Character、Boolean、Enum、Locate、Charset、Currency、Properties、UUID
- 常规类型(general):Object、String、TimeZone、Calendar、Optinal等
- Spring类型: Resource、InputResource、Formatter等
十二、集合类型注入
- 集合类型
- 数据类型(Array):原生类型、标量类型、常规类型、 Spring类型
- 集合类型(Collection):
- Collection:List、Set(SortedSet、Navigable、EnumSet)
- Map:Properties
十三、限定注入
代码演示:com.forjson.spring.dependency.injection.QualifierAnnotationDependencyInjectionDemo
- @Qualifier限定
- 通过Bean名称限定
- @通过分组限定
- 基本注解@Qualifier扩展限定
十四、延迟依赖注入
参考代码: com.forjson.spring.dependency.injection.LayAnnotationDependencyInjectionDemo
-
使用Api BeanFactory延迟注入
- 单一类型
- 集合类型
-
使用Api BeanProvier延迟注入(推荐)
- 单一类型
- 集合类型
十五、依赖处理过程
- 基础知识
- 入口 - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveDependency
- 依赖描述符 - DependencyDescriptor
- 自动绑定候选对象处理器 - AutowireCandidateResolver
十六、@autowired注入原理
- @Autowired注入过程
- 元信息描述
- 依赖查找
- 依赖注入(字段、方法)
十七、JSR-330 @Inject 注入原理
十八、Java 通用注解注入原理
十九、自定义依赖注入原理
参考演示代码:
com.forjson.spring.dependency.injection.CustomerAutowiredAnnotationDemo
- 基于AutowireAnnotationBeanPostProcessor实现
- 自定义实现
-
生命周期处理
- InstantiationAwareBeanProcessor
- MergedBeanDefinitionPostProcessor
-
元数据
- InjectedElement
- InjectionMetadata
-
二十、面试题精选
-
有多少种依赖注入?
- 构造器注入
- Setter注入
- 字段注入
- 接口回调注入
-
偏好构造器注入还是Setter注入
- 两种依赖注入均可使用,如果是必须依赖的话,推荐构造器注入,Setter注入用于可选依赖
- 构造器注入可以避免线程安全问题,因为构造器的创建是线程安全的。
- 两种依赖注入均可使用,如果是必须依赖的话,推荐构造器注入,Setter注入用于可选依赖
-
依赖注入的来源有哪些?