- 控制反转是一种设计模式,目的在于降低系统内部组件之间的相互依赖,使用依赖注入Dependence Inspect。
比如 classA中用到了classB的功能,实体依赖的方式:
Class A {
private ClassB b = new ClassB();
public funcA() {
this.b.funcB();
}
}
- 如果ClassB可能存在多种实现,需要降低对某一个具体类的依赖,需要进一步按照接口依赖的方式进行设计:
Class A {
private InterfaceB b;
A(InterfaceB b) {
this.b = b;
}
public void setB(InterfaceB b) {
this.b = b;
}
public funcA() {
this.b.funcB();
}
}
这样依赖,Class A不依赖与具体Class B的实现,而是依赖与InterfaceB,凡是实现了InterfaceB的实例都可以注入进来,完成具体业务功能。这里就可以理解为控制反转,ClassB的设计需要根据Class A 对 InterfaceB的需求来实现,而不再是ClassA的功能需要依赖ClassB的实现。
- 实现了接口依赖的设计之后,需要有地方对各个类进行实例话并按照接口依赖完成装配工作(注入工作),这里需要的就是一个对象(组件)管理器,完成组件发现、实例化、依赖注入、生命周期管理。 Spring的@Component、@Service、@Controller等声明被管理的组件,@
Autowired 注解用来申明依赖注入点。
@Component
Class B Implements InterfaceB {}
@Component
Class A() {
@Autowired
private InterfaceB b;
public void funcA() {
this.b.funcB();
}
}
注意:只有声明了@Component (或则@Service等)的组件,才能被自动注入依赖。如果依赖的接口有多个实现,可以使用@Qualifier('xxx') 对组件进行限定。







网友评论