Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 依赖注入和@DependsOn之间的区别_Java_Spring_Spring Boot_Dependency Injection_Dependencies - Fatal编程技术网

Java 依赖注入和@DependsOn之间的区别

Java 依赖注入和@DependsOn之间的区别,java,spring,spring-boot,dependency-injection,dependencies,Java,Spring,Spring Boot,Dependency Injection,Dependencies,我们在项目中使用Spring,今天我发现,在我眼中,有一种奇怪的beaviour。在我看来,依赖注入和注释@DependsOn在以下两种情况下应该是相同的 @Bean public ClassA classA(){ //code } @Bean public ClassB classB(ClassA classA){ someMethodWhichNeedsClassA() } 及 看来,这两种方式并不完全相同。我不允许共享我的代码,但在第一种情况下,我可以访问第一个Bea

我们在项目中使用Spring,今天我发现,在我眼中,有一种奇怪的beaviour。在我看来,依赖注入和注释@DependsOn在以下两种情况下应该是相同的

@Bean
public ClassA classA(){
    //code
}

@Bean
public ClassB classB(ClassA classA){
    someMethodWhichNeedsClassA()
}

看来,这两种方式并不完全相同。我不允许共享我的代码,但在第一种情况下,我可以访问第一个Bean中填写的列表,但在第二种情况下不能。 我试图在文档或其他博客中找到一些东西,但没有成功

有人知道这两种方法之间有什么不同吗,因为我认为这与bean创建的顺序有关,仅此而已


感谢您的帮助

Spring默认情况下管理bean的生命周期并安排其初始化顺序。第一个例子就是这样。在第二个示例中,您告诉Spring bean B依赖于A,所以Spring将在bean B之前创建bean A

当前bean所依赖的bean。指定的任何bean都是 保证在这个bean之前由容器创建。使用 在bean不显式依赖于 另一种是通过属性或构造函数参数,而不是 取决于另一个bean初始化的副作用


如果bean B调用bean A上的任何方法(或传递给最终调用bean A方法的其他对象/方法),那么依赖项注入就足够了

当bean B不需要调用bean A上的任何方法时, 但是依赖于bean A的初始化结果。假设bean A在初始化过程中在数据库中创建表, bean B需要这些表才能使用。那么依赖注入就没有意义了。任何代码质量检查都会显示这一点 未使用注入变量,因此不需要。 在这种情况下,您不会将bean A注入到B中,而是声明对bean A的依赖关系


简单地说:如果bean B调用bean A,则使用依赖项注入。如果bean B只需要bean A初始化的结果,那么使用@DependsOn。

简单地说,有两种情况

  • 若bean的创建是按顺序进行的,spring将从上到下开始初始化。在这种情况下,根据bean需要首先列出
  • 如果bean的创建不是按顺序进行的,并且是通过多个appconfig进行管理的,那么我们可以使用
    @DependsOn
    注释来确保在使用之前对依赖bean进行初始化

  • 嗨,谢谢你的回答。在第一种情况下,ClassA bean应该在ClassB之前创建,因为它在构造函数中使用,而Spring应该创建它,因为依赖注入请发布所有相关代码。我看不到使用这两个类的构造函数我不允许共享代码,但是ClassB并不直接依赖于ClassA,但是它调用了一个methode,它需要ClassA,你所说的方法someMethodWhichNeedsClassA()中的需要是什么?你的意思是这个方法调用classA吗?或者你的意思是它只需要bean类初始化的结果?
    @Bean
    public ClassA classA(){
        //code
    }
    
    @Bean
    @DependsOn("classA")
    public ClassB classB(){
        someMethodWhichNeedsClassA()
    }