Java 依赖注入和@DependsOn之间的区别
我们在项目中使用Spring,今天我发现,在我眼中,有一种奇怪的beaviour。在我看来,依赖注入和注释@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
@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。简单地说,有两种情况
@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()
}