Java Spring Boot 构造方法依赖注入究竟是如何工作的
Java Spring Boot how does constructor method dependency injection actually work
如果我什至没有在任何地方初始化 class 或传入参数,构造方法依赖注入如何工作。 Spring 会在某个地方为我处理这件事吗?如果有人不介意 sharing/teaching 我真的很想知道更多。这在堆上是如何工作的?是否会引用正在构造的 class 和依赖项,所以我会有两个不同对象的实例或只有一个?我找到了这个答案 ,但它并没有真正详细地回答我的问题。
示例:
@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 知道它需要通过在 [=50] 中管理它来为你提供这个 Bean =] IoC 容器。但是,为了 Spring 可以创建 Bean,它也会理解它需要另一个可用的 Bean,在您的例子中是 SomeRepository
。如果 Spring IoC Container 中已经存在这样的 Bean,则 Spring 将其提供给您的 SampleController
构造函数。为此,SomeRepository
也必须是一个 Spring-managed Bean,因此由前三种方式之一定义。
值得一提的是,例如,如果您的应用程序中有多个 SomeRepository
Bean(想象一个接口有多个实现,每个实现都是不同的 Bean),您需要“告诉”Spring你想在SampleController
中使用哪一个,否则你会得到一个错误。有多种方法可以做到这一点:
- 使用
@Qualifier
注释;
- 在其中一个实现上使用
@Primary
将其标记为“默认”,以防您没有明确“说出”您想要哪个实现。
您可以查看 https://www.baeldung.com/spring-qualifier-annotation 中的示例。
这是一个非常高级的描述,但您可以找到一些好的 articles online about this or even check the reference documentation。
如果我什至没有在任何地方初始化 class 或传入参数,构造方法依赖注入如何工作。 Spring 会在某个地方为我处理这件事吗?如果有人不介意 sharing/teaching 我真的很想知道更多。这在堆上是如何工作的?是否会引用正在构造的 class 和依赖项,所以我会有两个不同对象的实例或只有一个?我找到了这个答案
示例:
@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 知道它需要通过在 [=50] 中管理它来为你提供这个 Bean =] IoC 容器。但是,为了 Spring 可以创建 Bean,它也会理解它需要另一个可用的 Bean,在您的例子中是 SomeRepository
。如果 Spring IoC Container 中已经存在这样的 Bean,则 Spring 将其提供给您的 SampleController
构造函数。为此,SomeRepository
也必须是一个 Spring-managed Bean,因此由前三种方式之一定义。
值得一提的是,例如,如果您的应用程序中有多个 SomeRepository
Bean(想象一个接口有多个实现,每个实现都是不同的 Bean),您需要“告诉”Spring你想在SampleController
中使用哪一个,否则你会得到一个错误。有多种方法可以做到这一点:
- 使用
@Qualifier
注释; - 在其中一个实现上使用
@Primary
将其标记为“默认”,以防您没有明确“说出”您想要哪个实现。
您可以查看 https://www.baeldung.com/spring-qualifier-annotation 中的示例。
这是一个非常高级的描述,但您可以找到一些好的 articles online about this or even check the reference documentation。