Spring中的循环依赖(一)

Spring单例情况下是默认支持循环依赖的

首先说明一下什么是依赖注入

所谓依赖,举个例子说明,一个类Person,另一个类Car,如果Person的某个方法比如说drive,需要引用Car,则称Person类依赖于 Car类,延伸到对象,这种依赖关系依然成立,比如说Person类的对象boy依赖于Car类的对象TOYOTA。

Public Person{
...
public void drive(){
  Car toyota=new Car("TOYOTA");
  toyota.挂档;
  toyota.踩油门;
  toyota.打方向;
}
}

这其中的依赖关系,就导致了对象boy需要负责对象TOYOTA的创建,甚至是整个生命周期的管理,而这样显然会带来耦合度高,不易维护等缺点,比如说要让这个男孩驾驶一辆Audi,则还需要修改类Person的代码。

因此在java的设计理论中就提出了一条非常著名的原则,依赖倒转原则(Dependence Inversion),其核心思想就是要将这种具体类之间的依赖,尽量转换成抽象依赖,也就是说类Person应该依赖于抽象类ICar,而不是具体的类 Car,这里java就大力推荐了抽象和接口的使用

控制反转的另外一种说法也就是依赖注入(dependence injection),以上文的boy与TOYOTA为例,其核心就是要将boy依赖的对象TOYOTA注入到boy中去,而无需boy自己去引用TOYOTA,这个注入的过程,通常是由一个控制程序来完成的,无需对象去关心,举例如下:

Public Person{
private ICar car;
public Person(ICar onecar){
  car=onecar;
}
public void drive(){
  car.挂档;
  car.踩油门;
  car.打方向;
}
}

这个时候,进行注入并且调用的过程,就很简单了,如下:

Toyota toyota=new Toyota();
Person boy=new Person(toyota);
boy.drive();

这里我们假定,Toyota类是ICar接口类的一个具体实现。这个例子就演示一个最简单的注入方式的例子,也就是构造子方式注入,通过将依赖对象注入到对象的构造子中来实现。

另外还有一种常用的注入方式,就是属性方式注入,意思就是通过将依赖对象注入到对象的属性中来实现,还是以boy和Toyota的例子说明,如下:

Public Person{
private ICar car;
public Person(){
}
public void drive(){
  car.挂档;
  car.踩油门;
  car.打方向;
}
public ICar getCar(){
  return this.car;
}
public void setCar(ICar onecar){
  car=onecar;
}
}
Toyota toyota=new Toyota();
Person boy=new Person();
boy.setCar(toyota);
boy.drive();

那么,Spring Bean的生命周期到底在哪个步骤完成的依赖注入呢

发布了25 篇原创文章 · 获赞 22 · 访问量 3635

猜你喜欢

转载自blog.csdn.net/weixin_42443419/article/details/104131848