Bean 创建过程
自定义的初始化方法
通常通过 @Bean 注解的 initMethod 指定(不推荐XML形式的配置方式)。
Bean 销毁过程
自定义的销毁方法
类似自定义的初始化方法。
通常通过 @Bean 注解的 destoryMethod 指定(不推荐XML形式的配置方式)。
Bean循环依赖解决方法
通过构造方法注入依赖 —— 失败
Java代码
-
@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 会检测到“无法解决”的循环依赖:
Java代码
-
***************************
-
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,再调用属性方法注入相互依赖。
虽然字段注入的方式也能解决相互依赖,但是字段注入对测试不友好,不是非常推荐。
Java代码
-
@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;
-
}
-
...
-
}