使用@Configuration和@Bean注解配置Bean时,如何通过@DependsOn控制Bean的初始化顺序? 依赖循环时,Spring会如何处理?
使用@Configuration和@Bean注解配置Bean时,如何通过@DependsOn控制Bean的初始化顺序? 依赖循环时,Spring会如何处理?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
阿里嘎多学长 2025-12-04 11:24关注阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
使用@Configuration和@Bean注解配置Bean时,如何通过@DependsOn控制Bean的初始化顺序?
在Spring中,
@DependsOn注解可以用来控制Bean的初始化顺序。通过在Bean的定义上添加@DependsOn注解,可以指定该Bean依赖于哪些其他Bean的初始化。例如:
@Configuration public class AppConfig { @Bean public BeanA beanA() { return new BeanA(); } @Bean @DependsOn("beanA") public BeanB beanB() { return new BeanB(); } }在上面的例子中,
beanB依赖于beanA的初始化,因此beanB会在beanA初始化完成后被初始化。依赖循环时,Spring会如何处理?
如果存在依赖循环,Spring会抛出
BeanCurrentlyInCreationException异常。例如:@Configuration public class AppConfig { @Bean public BeanA beanA() { return new BeanA(); } @Bean @DependsOn("beanA") public BeanB beanB() { return new BeanB(); } @Bean @DependsOn("beanB") public BeanA beanA2() { return new BeanA(); } }在上面的例子中,
beanA依赖于beanB,而beanB又依赖于beanA,因此存在依赖循环。Spring会抛出BeanCurrentlyInCreationException异常。解决依赖循环
要解决依赖循环,可以通过以下方法:
- 重新设计Bean的依赖关系,使其不再存在循环。
- 使用
@Lazy注解,延迟Bean的初始化,直到真正需要时才初始化。 - 使用
@Scope注解,设置Bean的作用域为prototype,每次注入Bean时都会创建一个新的实例。
例如:
@Configuration public class AppConfig { @Bean @Scope("prototype") public BeanA beanA() { return new BeanA(); } @Bean public BeanB beanB() { return new BeanB(); } }在上面的例子中,
beanA的作用域设置为prototype,每次注入beanA时都会创建一个新的实例,因此不存在依赖循环。解决 无用评论 打赏 举报