Spring Bean 生命周期 + 循环依赖解决方法

阅读更多

Bean 创建过程

Spring Bean 生命周期 + 循环依赖解决方法_第1张图片
 

自定义的初始化方法

通常通过 @Bean 注解的 initMethod 指定(不推荐XML形式的配置方式)。

 

Bean 销毁过程

Spring Bean 生命周期 + 循环依赖解决方法_第2张图片
 

自定义的销毁方法

类似自定义的初始化方法。
通常通过 @Bean 注解的 destoryMethod 指定(不推荐XML形式的配置方式)。

 

Bean循环依赖解决方法


Spring Bean 生命周期 + 循环依赖解决方法_第3张图片
 

通过构造方法注入依赖 —— 失败

@Service
public class FooServiceImpl implements FooService {
  private BarService barService;

  public FooServiceImpl(BarService barService) {
    this.barService = barService;
  }
  ...
}

@Service
public class BarServiceImpl implements BarService {
  private FooService fooService;

  public BarServiceImpl(FooService fooService) {
    this.fooService = fooService;
  }
  ...
}

 

这种形式下,程序启动时,Spring 会检测到“无法解决”的循环依赖:

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  barServiceImpl defined in file [.../BarServiceImpl.class]
↑     ↓
|  fooServiceImpl defined in file [.../FooServiceImpl.class]
└─────┘

 

解决方法:通属性方法注入依赖

Spring 会先创建Bean实例 FooServiceImpl 和 BarServiceImpl,再调用属性方法注入相互依赖。
虽然字段注入的方式也能解决相互依赖,但是字段注入对测试不友好,不是非常推荐。

@Service
public class FooServiceImpl implements FooService {
  private BarService barService;

  @Autowired
  public void setBarService(BarService barService) {
    this.barService = barService;
  }
  ...
}

@Service
public class BarServiceImpl implements BarService {
  private FooService fooService;

  @Autowired
  public void setFooService(FooService fooService) {
    this.fooService = fooService;
  }
  ...
}

 

  • Spring Bean 生命周期 + 循环依赖解决方法_第4张图片
  • 大小: 59 KB
  • Spring Bean 生命周期 + 循环依赖解决方法_第5张图片
  • 大小: 18.3 KB
  • Spring Bean 生命周期 + 循环依赖解决方法_第6张图片
  • 大小: 55.8 KB
  • 查看图片附件

你可能感兴趣的:(spring)