在Spring中,依赖注入(Dependency Injection,简称DI)主要有两种变体,基于构造器的依赖注入和基于setter的依赖注入
基于构造器的依赖注入
基于构造函数的DI是由容器调用一个构造函数来完成的,该构造函数有许多参数,每个参数表示一个依赖项。调用具有特定参数的静态工厂方法来构造bean几乎是等价的。
例如:
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on a MovieFinder
private MovieFinder movieFinder;
// a constructor so that the Spring container can inject a MovieFinder
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
在上述代码中SimpleMovieLister依赖于MovieFinder对象,SimpleMovieLister在使用MovieFinder不是直接new一个对象,而是只是声明MovieFinder对象,通过SimpleMovieLister的构造器将其注入进来。
这样做的好处在于当MovieFinder的实现改变时,例如希望给MovieFinder添加一个参数时,不仅需要改变MovieFinder的代码,还需要改变SimpleMovieLister的代码,表明SimpleMovieLister不仅依赖于MovieFinder这个接口(),还依赖于其本身的实现。代码出现了耦合。而采用依赖注入则解决了该问题。
基于Seter的依赖注入
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on the MovieFinder
private MovieFinder movieFinder;
// a setter method so that the Spring container can inject a MovieFinder
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}