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