jeakboy 2025-12-04 11:19 采纳率: 56.8%
浏览 4

使用@Configuration和@Bean注解配置Bean时,如何通过@DependsOn控制Bean的初始化顺序? 依赖循环时,Spring会如何处理?

  • 写回答

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异常。

    解决依赖循环

    要解决依赖循环,可以通过以下方法:

    1. 重新设计Bean的依赖关系,使其不再存在循环。
    2. 使用@Lazy注解,延迟Bean的初始化,直到真正需要时才初始化。
    3. 使用@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时都会创建一个新的实例,因此不存在依赖循环。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月4日