转载别人的图:依赖注入底层原理流程图:
https://www.processon.com/view/link/5f899fa5f346fb06e1d8f570
spring的依赖注入分为手动注入与自动注入
手动注入
- xml指定属性 通过set注入
- xml指定构造器,通过构造器注入
自动注入
-
xml的autowire 自动注入
- byType set里的变量的属性
- byName set后面的名字
- constructor
- default 用bean标签里的autowire
- no 关闭autowired
-
@Autowired注解注入
- 和xml差不多,只是更细粒度的控制,比如可以指定用哪个构造方法
-
static的字段或方法为什么不支持
这俩个bean都是原型bean,orderservice也是原型bean,userService1 和 userService2创建好了之后,分别注入 static orderService,结果orderSerivce的值变了,从而导致问题;遂spring禁制
-
注入点注入
-
spring在AutowiredAnnotationBeanPostProcessor的postProcessorProperties()方法中,遍历找到的所有注入点依次注入。
-
遍历字段注入
-
调用beanfactory的resolveDependency方法,传入dependencyDescriptor对象,进行以来查找,匹配当前字段对应的bean对象
-
将DependencyDescriptor对象和所找到的结果对象beanName封装成一个
ShortcutDependencyDescriptor对象作为缓存,比如如果当前Bean是原型Bean,那么下次
再来创建该Bean时,就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象
了,不用再次进行查找了
- 利用反射将结果对象赋值给字段。
-
-
Set方法注入
\1. 遍历所有的AutowiredMethodElement对象
\2. 遍历将对应的方法的参数,将每个参数封装成MethodParameter对象
\3. 将MethodParameter对象封装为DependencyDescriptor对象
\4. 调用BeanFactory的resolveDependency()方法,传入DependencyDescriptor对象,进行依
赖查找,找到当前方法参数所匹配的Bean对象。
\5. 将DependencyDescriptor对象和所找到的结果对象beanName封装成一个
ShortcutDependencyDescriptor对象作为缓存,比如如果当前Bean是原型Bean,那么下次
再来创建该Bean时,就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象
了,不用再次进行查找了
\6. 利用反射将找到的所有结果对象传给当前方法,并执行