spring有两种两种类型的DI:设定器DI和结构DI。
基于构造函数的DI固定需要注入依赖项的顺序。基于Setter的DI不提供此功能。
基于Setter的DI帮助我们仅在需要时才注入依赖,而不是在构造时要求依赖。
我看不到任何其他显着差异,因为两种类型的Spring DI提供相同的功能-设置程序和构造函数DI在代码启动时都会注入依赖项。诚然,构造函数DI将通过构造函数完成此操作,而setter DI将在构造对象后立即通过setter完成此操作,但对于开发人员而言,在性能等方面没有任何区别。两者都提供了指定顺序的方法依赖注入。
关于Spring的特定优缺点:
构造函数注入(根据定义)不允许你在bean之间创建循环依赖关系。这个限制实际上是构造函数注入的一个优势-使用setter注入时,Spring可以解决循环依赖性,而你甚至不会注意到。
另一方面,如果使用构造函数注入,则CGLIB无法创建代理,从而迫使你使用基于接口的代理或虚拟无参构造函数。