如果我甚至没有在任何地方初始化类或传入参数,构造函数方法依赖注入如何工作。Spring在什么地方帮我搞定了吗?真的很想知道更多关于这个,如果有人不介意分享/教我。这在堆上是如何工作的?是否会有对正在构建的类和依赖关系的引用,因此我会有两个不同对象的实例或只有一个?我发现这个答案构造函数依赖注入是如何工作的?,但它并没有真正详细地回答我的问题。
的例子:
@Controller
@RequestMapping
public class SampleController{
private final SomeRepository someRepository;
pulbic SampleController(SomeRepository someRepository) throws Exception{
// will someRepository ever be null?
if(someRepository == null)
throw new Exception("I told you it wouldn't work!");
this.someRepository = someRepository;
}
回答你的问题:是的。Spring代表您管理所有bean。您可以用多种方式声明Bean:
- XML(旧方式);
- 使用
@Bean
(但在这种情况下,您将实际实例化Bean); - 使用
@Component
、@Service
、@Repository
或@Controller
(后3种基本上是前者的专门化)。
在您的示例中,您已经用@Controller
注释了SampleController
,因此现在Spring知道它需要通过在Spring IoC容器中管理它来为您提供这个Bean。但是,为了使Spring能够创建Bean,它还将理解它需要另一个可用的Bean,在您的示例中是SomeRepository
。如果这样的Bean已经存在于Spring IoC容器中,那么Spring将它提供给SampleController
构造函数。要做到这一点,SomeRepository
还必须是spring管理的Bean,因此必须由前面三种方式之一定义。
值得一提的是,例如,如果您的应用程序中有多个SomeRepository
Bean(想象一个接口有多个实现,每个实现都是不同的Bean),您需要"告诉";Spring你想在SampleController
中使用哪个,否则你会得到一个错误。有多种方法可以做到这一点:
- 使用
@Qualifier
注释; - 在其中一个实现上使用
@Primary
将其标记为"默认"如果你没有明确地说">
您可以在https://www.baeldung.com/spring-qualifier-annotation查看示例。
这是一个非常高级的描述,但是你可以在网上找到一些关于这方面的好文章,甚至可以查看参考文档。