通常在Spring中说的依赖注入,控制反转,依赖反转等名词时,总是不理解其中包含的意思,今天来梳理一下。
依赖反转:依赖对象的获得被反转了,是指调用者不再创建被调用者的实例,由spring框架实现(容器创建),又称控制反转。
依赖注入:容器创建好实例后再注入调用者称为依赖注入。
下面一个小实例:
定义一个接口
public interface Person {
void sayHello();
}
第一个实现类:
public class Chinese implements Person {
public void sayHello() {
System.out.println("您好 !");
}
}
第二个实现类:
public class American implements Person {
public void sayHello() {
System.out.println("How do you do .");
}
}
这个类与传统设计有什么区别:该类调用Person子类的方法,传统设计在本类中创造实例,而在此类里并没有创造实例
public class User {
Person p; // Person p = new Person();传统方法
public Person getP() {
return p;
}
//使用setter注入
public void setP(Person p) {
this.p = p;
}
//调用person子类重写的sayHello方法,这里的p并没有实例化
public void function(){
p.sayHello();
}
}
外部‘容器’,类似于spring中的IoC中的一小部分
public class Container{
public static User getBean(){
Person p=new Chinese();
User user = new User();
//由容器‘注入’实例,依赖注入
user.setP(p);
return user;
}
}
测试类:
public class Test{
public static void main(String[] args){
User user = Container.getBean();
user.function();
}
}
//后台输出‘您好’
在Spring中,我们看到的就是, Java EE的服务都被抽象到IoC容器中,并通过AOP进行有效的封装,因为依赖注入的特性,这些复杂的依赖关系的管理被反转并被交给容器,使复杂的依赖关系管理从应用中解放出来了。各个模块的依赖关系通过简单的IoC配置文件进行描述,使这些外部化的信息集中并且明了,我们在使用其他组件服务时,只需要去配置文件中了解和配置这些依赖关系即可。