Java Spring Boot构造函数方法依赖注入是如何工作的



如果我甚至没有在任何地方初始化类或传入参数,构造函数方法依赖注入如何工作。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:

  1. XML(旧方式);
  2. 使用@Bean(但在这种情况下,您将实际实例化Bean);
  3. 使用@Component@Service@Repository@Controller(后3种基本上是前者的专门化)。

在您的示例中,您已经用@Controller注释了SampleController,因此现在Spring知道它需要通过在Spring IoC容器中管理它来为您提供这个Bean。但是,为了使Spring能够创建Bean,它还将理解它需要另一个可用的Bean,在您的示例中是SomeRepository。如果这样的Bean已经存在于Spring IoC容器中,那么Spring将它提供给SampleController构造函数。要做到这一点,SomeRepository还必须是spring管理的Bean,因此必须由前面三种方式之一定义。

值得一提的是,例如,如果您的应用程序中有多个SomeRepositoryBean(想象一个接口有多个实现,每个实现都是不同的Bean),您需要"告诉";Spring你想在SampleController中使用哪个,否则你会得到一个错误。有多种方法可以做到这一点:

  1. 使用@Qualifier注释;
  2. 在其中一个实现上使用@Primary将其标记为"默认"如果你没有明确地说">

您可以在https://www.baeldung.com/spring-qualifier-annotation查看示例。

这是一个非常高级的描述,但是你可以在网上找到一些关于这方面的好文章,甚至可以查看参考文档。

最新更新