Spring之Bean的依赖注入原理
2023-02-21 21:02:53 0 举报
AI智能生成
Bean的依赖注入原理
作者其他创作
大纲/内容
1. 遍历当前类的所有的属性字段Field
2. 查看字段上是否存在@Autowired、@Value、@Inject,存在则认为该字段是一个注入点
3.如果字段是static的,则不进行注入
4. 获取@Autowired中的required属性的值
5. 将字段信息构造成一个AutowiredFieldElement对象,作为一个注入点对象添加到currElements集合中。
遍历字段
1. 遍历当前类的所有的方法Method
2. 判断当前Method是否是桥接方法,如果是找到原方法
3. 查看方法上是否存在@Autowired、@Value、@Inject存在则认为该方法是一个注入点
4.如果方法是static的,则不进行注入
5.获取@Autowired中的required属性的值
6.将方法信息构造成一个AutowiredMethodElement对象,作为一个注入点对象添加到currElements集合中
遍历方法
遍历完当前类的字段和方法后,将遍历父类的的字段和方法,直到没有父类
遍历父类
最后将currElements集合封装成一个InjectionMetadata对象,作为当前Bean对于的注入点集合对象,并缓存
Bean的生命周期
1.寻找注入点
1. 遍历所有的AutowiredFieldElement对象。
2. 将对应的字段封装为DependencyDescriptor对象
3. 调用BeanFactory的resolveDependency()方法,传入DependencyDescriptor对象,进行依赖查找,找到当前字段所匹配的Bean对象。
4. 将DependencyDescriptor对象和所找到的结果对象beanName封装成一个ShortcutDependencyDescriptor对象作为缓存,比如如果当前Bean是原型Bean,那么下次再来创建该Bean时,就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象了,不用再次进行查找了
5. 利用反射将结果对象赋值给字段。
字段注入
1. 遍历所有的AutowiredMethodElement对象
2. 遍历将对应的方法的参数,将每个参数封装成MethodParameter对象
3. 将MethodParameter对象封装为DependencyDescriptor对象
4. 调用BeanFactory的resolveDependency()方法,传入DependencyDescriptor对象,进行依赖查找,找到当前方法参数所匹配的Bean对象。
5. 将DependencyDescriptor对象和所找到的结果对象beanName封装成一个ShortcutDependencyDescriptor对象作为缓存,比如如果当前Bean是原型Bean,那么下次再来创建该Bean时,就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象了,不用再次进行查找了
6. 利用反射将找到的所有结果对象传给当前方法,并执行
方法注入
2.根据注入点寻找bean
判断注解是否required,如果是则报错
没找到bean
利用反射注入这个bean
找到一个bean
先判断是不是isAutowireCandidate
再判断是不是符合Qualifier
如果还有多个取标注了@Primary的bean
取优先级较高的Bean
如果是属性就是属性名称
如果是方法就是参数名称
根据名称进行筛选
找到多个bean
3.如果获取到多个bean
Bean的依赖注入
0 条评论
回复 删除
下一页