Spring IoC 依赖注入
2022-08-08 11:50:27 9 举报
AI智能生成
Spring IoC 依赖注入分析
作者其他创作
大纲/内容
依赖注入的模式
手动模式 - 配置或者编程的方式,提前安排注入规则
XML 资源配置元信息
Java 注解配置元信息
API 配置元信息
自动模式 - 实现方提供依赖自动关联的方式,按照內建的注入规则
Autowiring(自动绑定)
依赖注入类型
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 { ... }
Autowiring modes
no
默认值,未激活 Autowiring,需要手动指定依赖注入对象
byName
根据被注入属性的名称作为 Bean 名称进行依赖查找,并将对象设置到 该属性
byType
根据被注入属性的类型作为依赖类型进行查找,并将对象设置到该属性
constructor
特殊 byType 类型,用于构造器参数
参考枚举:org.springframework.beans.factory.annotation.Autowire
为什么不建议用autowiring
不能绑定简单的类型(八种原生类型加String类型)
autowiring不具有精确性,它是一种猜测性的东西,然而Spring非常在乎精确性
wiring很难在工具方面进行呈现,很难确定你这个autowiring的bean在上下文是否存在
如果存在多个定义的bean,会报错,系统不知道你需要的是哪个bean
Setter方法注入
手动模式
XML 资源配置元信息
xml配置
获取示例
Java 注解配置元信息
使用示例
API 配置元信息
使用示例
自动模式
byName
xml配置
获取示例
byType
xml配置
获取示例
Constructor注入
手动模式
XML 资源配置元信息
xml配置
获取示例
Java 注解配置元信息
使用示例
API 配置元信息
使用示例
自动模式
constructor
xml配置
获取示例
Field注入
手动模式
Java 注解配置元信息
@Autowired
@Resource
@Inject(可选)
示例
Method注入
手动模式
Java 注解配置元信息
@Autowired
@Resource
@Inject(可选)
示例
接口回调(Aware)注入
自动模式
涉及接口一
涉及接口二
Aware接口说明
该接口现在只支持上述图中接口,不支持扩展
示例
注入类型选择
低依赖:构造器注入
对于注入对象有顺序要求的需要使用构造器注入
构造器注入无法解决循环依赖的问题
多依赖:Setter 方法注入
多对象注入采用这种方式比较好
无法保证对象注入的顺序
便利性:字段注入
声明类:方法注入
构造器注入保证的顺序是由于构造器参数的顺序是确定,因此,它们在注入的过程中是按照顺序。而方法注入,由于 Java 反射 API 所获取的数组顺序不确定会导致某种依赖相关的错误。
基础类型注入
类型
原生类型(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
案例
dependency-base-type-injection.xml
base-type-resource.xml
CityEnum枚举
基础类型DTO
注入类
运行结果
集合类型注入
数组类型(Array)
原生类型
标量类型
常规类型
Spring 类型
集合类型(Collection)
Collection
List
Set(SortedSet、NavigableSet、EnumSet)
Map
Properties
案例
dependency-base-type-injection.xml
base-type-resource.xml
CityEnum枚举
基础类型DTO
注入类
运行结果
限定注入
使用注解 @Qualifier 限定
获取指定名称的 bean
通过分组限定
没有限定,获取当前第一个上下文内所有的 bean
获取所有标注了 @Qualifier 注解的对象,包括被扩展注解 @NormalUserGroup 标注的对象
获取所有标注 @Qualifier 注解并且内容值为 superUser 的对象,扩展注解也会被获取,也是 value 为 superUser 的 bean 对象
获取扩展注解 @NormalUserGroup 标注的 bean 对象, 如果还有基于 @NormalUserGroup 的扩展注解同样能找到
基于注解 @Qualifier 扩展限定
使用案例
dependency-lookup-context.xml
NormalUserGroup
AnnotationQualifierInjectionDemo
@Qualifier 使用注意事项
当只有一个上下文时
没有标记 @Qualifier 注解,会自动导入该上下文类所有的 bean
当有多个上下文时
没有标记 @Qualifier 注解,会自动导入第一个上下文类中所有的 bean
延迟依赖注入
使用 API ObjectFactory 延迟注入
单一类型
集合类型
使用 API ObjectProvider 延迟注入(推荐)
该类型下不会抛出异常,使用更加安全
该类型下不会抛出异常,使用更加安全
单一类型
集合类型
使用案例
LazyAnnotationInjectionDemo
依赖处理过程(源码分析)
执行流程
DefaultListableBeanFactory#resolveDependency 判断是否懒加载,懒加载直接返回CGLIB代理对象;
doResolveDependency 开始进行依赖注入;
resolveMultipleBeans 判断注入的对象是否是集合类型(Stream,Collection,Array,Map) ,是的话直接return ;
findAutowireCandidates 根据类型查找所有匹配到的bean,返回一个Map对象;
determineAutowireCandidate 选取唯一bean名称,如果有多个bean,即返回@Primary修饰的;
通过BeanFactory#getBean返回结果
参考文献
Spring依赖注入源码解析
@Autowired 注入的过程
执行流程
元信息解析
DependencyDescriptor
依赖查找
依赖注入
源码分析
@Autowired 注解原理分析
通用注解
CommonAnnotationBeanPostProcessor
注入注解
javax.xml.ws.WebServiceRef
javax.ejb.EJB
javax.annotataion.Resource
生命周期注解
javax.annotation.PostConstruct
javax.annotation.PreDestroy
源码分析
参考文献地址
createBean 执行流程图
参考文献地址
0 条评论
下一页