gpt4 book ai didi

java - spring如何使用@Resource来注册bean

转载 作者:行者123 更新时间:2023-12-02 10:20:24 24 4
gpt4 key购买 nike

我正在研究公司里某人的代码,发现了一个奇怪的代码,但不知道它是如何工作的。

代码如下所示

interface A {...}

interface B {...}

class MyClass implements A, B {...}

@Bean
B myB() {new MyClass();}

@Autowired
A a;

//***************** a will inject failed(bean not found) if I delete this part
@Resource
MyClass myB;
//******************

我不知道为什么spring可以找到“a”。

我尝试删除@Resource部分,它告诉我找不到bean,所以spring使用@Resource来注册bean?

我认为只有 @Bean 可以做到这一点(是的,我知道 xml 也可以做到这一点),不是吗?

最佳答案

有趣的问题。我认为发生这种情况是因为 Spring 在依赖注入(inject)期间使用了某种优化/惰性创建。

这只是我的假设,但对于这个问题来说这是一个很好的解释:

当 Spring 发现一个 @bean 注解时,它不会立即创建该 bean,而是仅注册它。 (这是很合乎逻辑的,bean 可以相互依赖,所以首先它只尝试收集所有已注册的 bean,然后再尝试实际创建它们)。它还收集所有需要注入(inject)bean的地方。

然后它会尝试分轮完成注入(inject)。只要它能够在一轮中完成至少一次注入(inject),它就会继续该过程。

注册 bean 时,它们是通过来自注释属性或方法名称和返回类型的名称和类型进行注册的。因此将会有一个名为 myB 且类型为 B

注册的 bean

在第一轮它找不到任何 Bean

@Autowired
A a;

所以它会跳过它。

然后它尝试将 bean 注入(inject)

@Resource
MyClass myB;

它可以通过名称找到已注册的bean。虽然注册的bean的类型不相同,也不是所需类型的扩展,但是这个bean是通过名称请求的,并且它的实际实例类型还不知道,所以 - 我假设 - 此时Spring的注入(inject)逻辑相信程序员的意愿,它通过调用 myB() 实例化 bean,根据所需类型检查实际类型,并且由于它匹配,它会愉快地注入(inject)返回的 bean 并更新 注册表中的 bean 类型与实际类型,即 MyClass

没有更多注入(inject),因此开始下一轮:

现在,当它尝试注入(inject)时

@Autowired
A a;

它仍然无法通过名称找到 bean,但它可以找到注册类型为 A 实例的 bean,因此它也可以注入(inject)该 bean。

所以,简而言之:如果您按名称请求一个 bean,那么 Spring 将检查该 bean 是否满足其他不匹配的类型要求,但如果您按类型请求一个 bean,它不会检查所有可用 bean 的实际类型,相反,会引发异常并让您改进注入(inject)。

关于java - spring如何使用@Resource来注册bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com