重新理解spring IOC

一直以来自认为对于spring有一些自己的理解,但最近在写一个开源的缓存框架。开发starter时遇到一些瓶颈,查资料过程中发现一篇不错的文章,觉得讲的挺有道理,这里写点笔记记录一下。

依赖注入dependency injection

一直认为的spring依赖注入方式有3种,其实官方写的只有两种:

DI exists in two major variants: Constructor-based dependency injection and Setter-based dependency injection.

  1. 构造器注入✅
  2. set注入✅
  3. 注解❌

依赖注入是一个装配的过程,使用的注入方式只有构造器或者set以及他们的变种;而@autowired注入是通过spring的后置处理器使用反射进行处理的。

 

自动注入(DI) != 自动装配

之所以会把依赖注入DI理解错,是因为把依赖注入和自动装配认为是一件事了。其实不然,DI只是装配过程中方式,而装配又分为自动装配和手动装配。自动装配有4种模式:

  1. no(不自动装配,0)
  2. byName(通过name自动装配,1)
  3. byType(通过类型自动装配,2)
  4. constructor(通过构造器自动装配,3)

与之对应的是我们XML 配置中的autowire属性

之所以我们把@autowired认为是自动装配,主要是因为这个注解会先按照类型注入,有一个符合条件的注入,有多个再按照名字去找。他的行为就很像byType和byName

其次,当我们使用@component + @autowired注解时,所以行为上已经很大程度上精简了bean的依赖配置,但是看源码其实他的自动注入模型值是0.并不是自动注入。

而且即使我们的类被@component标记时,使用了全参构造器,他的注入类型依然是0,而不是constructor。只是我认为spring提供给了一个默认的行为,让使用注解+构造器时行为等同于自动装配。

大大降低配置。

你可能感兴趣的:(笔记,spring)