随堂笔记5-spring依赖注入

转载别人的图:依赖注入底层原理流程图:

https://www.processon.com/view/link/5f899fa5f346fb06e1d8f570

1675910116609

1675910154323

spring的依赖注入分为手动注入与自动注入

手动注入

  1. xml指定属性 通过set注入
  2. xml指定构造器,通过构造器注入

自动注入

  1. xml的autowire 自动注入

    1. byType set里的变量的属性
    2. byName set后面的名字
    3. constructor
    4. default 用bean标签里的autowire
    5. no 关闭autowired
  2. @Autowired注解注入

    1. 和xml差不多,只是更细粒度的控制,比如可以指定用哪个构造方法
  3. static的字段或方法为什么不支持

    ​ 这俩个bean都是原型bean,orderservice也是原型bean,userService1 和 userService2创建好了之后,分别注入 static orderService,结果orderSerivce的值变了,从而导致问题;遂spring禁制

  4. 注入点注入

    1. spring在AutowiredAnnotationBeanPostProcessor的postProcessorProperties()方法中,遍历找到的所有注入点依次注入。

    2. 遍历字段注入

    3. 调用beanfactory的resolveDependency方法,传入dependencyDescriptor对象,进行以来查找,匹配当前字段对应的bean对象

    4. DependencyDescriptor对象和所找到的结果对象beanName封装成一个

      ShortcutDependencyDescriptor对象作为缓存,比如如果当前Bean是原型Bean,那么下次

      再来创建该Bean时,就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象

      了,不用再次进行查找了

      1. 利用反射将结果对象赋值给字段。
  5. Set方法注入

    \1. 遍历所有的AutowiredMethodElement对象

    \2. 遍历将对应的方法的参数,将每个参数封装成MethodParameter对象

    \3. 将MethodParameter对象封装为DependencyDescriptor对象

    \4. 调用BeanFactory的resolveDependency()方法,传入DependencyDescriptor对象,进行依

    赖查找,找到当前方法参数所匹配的Bean对象。

    \5. 将DependencyDescriptor对象和所找到的结果对象beanName封装成一个

    ShortcutDependencyDescriptor对象作为缓存,比如如果当前Bean是原型Bean,那么下次

    再来创建该Bean时,就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象

    了,不用再次进行查找了

    \6. 利用反射将找到的所有结果对象传给当前方法,并执行

posted @ 2023-02-09 17:44  小傻孩丶儿  阅读(36)  评论(0编辑  收藏  举报