在@Configuration类中使用ApplicationContext

时间:2018-01-31 15:54:23

标签: java spring spring-bean

关于以下代码:

  1. 加载 ServicesConfig1 时,我是否可以确定 ApplicationContext 已加载且永远不会 NULL
  2. 加载 Bean1 时,如何确定 Bean2 已加载?假设我无法将 Bean2 声明移至 ServicesConfig1

    我测试了它并且 ApplicationContext 不是 NULL ,但我只是想确保它没有以随机顺序加载,所以我的测试现在下次通过会失败。

    ˚F

    @Configuration
        public class ServicesConfig1
        {
    
    
            @Inject
            private ApplicationContext ctx;
    
    
    
            @Bean
            public Bean1 bean1() 
            {
    
                Bean2 bean2 = ctx.getBean(Bean2.class);
                ....
            }
    
    
        }
    
    
        @Configuration
        public class ServicesConfig2
        {
    
    
            @Bean
            public Bean2 bean2() 
            {
                return new Bean2();
            }
    
        }
    

2 个答案:

答案 0 :(得分:0)

您根本不需要在这里注入ApplicationContext。 将ApplicationContext视为更具容器特定的bean,它允许对bean生命周期进行更细粒度的控制,并且在大多数情况下您不需要。

对于具体案例,您可以使用简单的依赖注入。

@Configuration
public class ServicesConfig1{
    @Bean
    public Bean1 bean1(Bean2 bean2){
        ....
    }
}

@Configuration
public class ServicesConfig2 {
    @Bean
    public Bean2 bean2() {
        return new Bean2();
    }
}

通过将bean2作为参数传递给bean1,您向DI容器发出信号,要构建它,您依赖于bean2,因此容器将查看bean2已经被实例化了,如果没有,它会创建它,然后为你注入它。

答案 1 :(得分:-1)

您可以使用@DependsOn

@Configuration
    public class ServicesConfig1
    {


        @Inject
        private ApplicationContext ctx;



        @Bean
        @DependsOn(value = "Bean2")
        public Bean1 bean1() 
        {

            Bean2 bean2 = ctx.getBean(Bean2.class);
            ....
        }


    }


    @Configuration
    public class ServicesConfig2
    {


        @Bean
        public Bean2 bean2() 
        {
            return new Bean2();
        }

    }

更好的解决方案是将Bean2作为bean1函数的参数。这样spring将初始化并将其注入到您的函数中。

        @Bean  
        public Bean1 bean1(Bean2 bean2) 
        {
            ...
         }