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

Bean 创建过程

自定义的初始化方法

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

Bean 销毁过程

自定义的销毁方法

类似自定义的初始化方法。

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

Bean循环依赖解决方法

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

Java代码

 

  1. @Service  

  2. public class FooServiceImpl implements FooService {  

  3.   private BarService barService;  

  4.   

  5.   public FooServiceImpl(BarService barService) {  

  6.     this.barService = barService;  

  7.   }  

  8.   ...  

  9. }  

  10.   

  11. @Service  

  12. public class BarServiceImpl implements BarService {  

  13.   private FooService fooService;  

  14.   

  15.   public BarServiceImpl(FooService fooService) {  

  16.     this.fooService = fooService;  

  17.   }  

  18.   ...  

  19. }  

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

Java代码

 

  1. ***************************  

  2. APPLICATION FAILED TO START  

  3. ***************************  

  4.   

  5. Description:  

  6.   

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

  8.   

  9. ┌─────┐  

  10. |  barServiceImpl defined in file [.../BarServiceImpl.class]  

  11. ↑     ↓  

  12. |  fooServiceImpl defined in file [.../FooServiceImpl.class]  

  13. └─────┘  

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

Spring 会先创建Bean实例 FooServiceImpl 和 BarServiceImpl,再调用属性方法注入相互依赖。

虽然字段注入的方式也能解决相互依赖,但是字段注入对测试不友好,不是非常推荐。

Java代码

 

  1. @Service  

  2. public class FooServiceImpl implements FooService {  

  3.   private BarService barService;  

  4.   

  5.   @Autowired  

  6.   public void setBarService(BarService barService) {  

  7.     this.barService = barService;  

  8.   }  

  9.   ...  

  10. }  

  11.   

  12. @Service  

  13. public class BarServiceImpl implements BarService {  

  14.   private FooService fooService;  

  15.   

  16.   @Autowired  

  17.   public void setFooService(FooService fooService) {  

  18.     this.fooService = fooService;  

  19.   }  

  20.   ...  

  21. }  

发布了219 篇原创文章 · 获赞 3 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/hchaoh/article/details/103906584