未使用Spring之前,可以这样管理两个类之间的依赖关系:
public class TextEditor { private SpellChecker spellChecker; public TextEditor() { spellChecker = new SpellChecker(); } }
带来的问题是,SpellChecker的实现类与TextEditor的使用类耦合在一起了,如果变换了一种SpellChecker的实现方式,需要同步修改TextEditor的代码,不利于单元测试、也不利于后期功能的扩展
解决方式是解耦,即将TextEditor主动new SpellChecker的地方,转成被动的获取,通过暴露对外方法,来将具体的实现类对象传入TextEditor中,实现方式有两种:
一种是通过TextEditor的构造方法,在初始化TextEditor时将依赖传入:
public class TextEditor { private SpellChecker spellChecker; public TextEditor(SpellChecker spellChecker) { this.spellChecker = spellChecker; } }
另一种方式是通过set方法来实现。这也是在使用Spring的过程中常用的方式,将依赖关系委托给Spring容器来管理