Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring如何使用@Resource注册bean_Java_Spring - Fatal编程技术网

Java spring如何使用@Resource注册bean

Java spring如何使用@Resource注册bean,java,spring,Java,Spring,我正在我公司研究某人的代码,发现了一个奇怪的代码,但不知道它是如何工作的 代码如下所示 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 @Re

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

代码如下所示

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;
//******************
我不知道为什么春天能找到a

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


我以为只有@Bean能做到这一点,我知道xml也能做到,不是吗?

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

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

当Spring找到@bean注释时,它不会立即创建bean,而是只注册它。这是非常合乎逻辑的,bean可以相互依赖,所以首先它只尝试收集所有注册的bean,然后才尝试实际创建它们。它还收集所有需要注射豆子的地方

然后,它试着将注射剂依次注满。只要在一轮中至少注满一次,它就会继续这个过程

注册bean时,它们将按名称和类型注册,这些名称和类型来自注释属性或方法名称和返回类型。 因此将有一个名为myB、类型为B的bean注册

在第一轮中,它找不到任何可供选择的豆子

@Autowired
A a;
所以它跳过了它

然后它尝试将一个bean注入到

@Resource
MyClass myB;
它可以通过名称找到已注册的bean。尽管注册bean的类型不同,也不是所需类型的扩展,但该bean是通过名称请求的,其实际实例类型尚不清楚,因此-我假设-此时Spring的注入逻辑相信程序员的意愿,它通过调用myB来实例化bean,根据所需类型检查实际类型,因为它匹配,所以它愉快地注入返回的bean,并使用实际类型(MyClass)更新注册表中的bean类型

没有更多注射,因此开始下一轮:

现在,当它试图注入

@Autowired
A a;
它仍然无法通过名称找到bean,但它可以找到注册类型为实例的bean,因此它也可以注入该bean

因此,简言之:
如果您按名称请求bean,那么Spring将检查该bean是否满足了其他不匹配的类型要求,但是如果您按类型请求bean,它不会检查所有可用bean的实际类型,相反,它会引发一个异常并允许您优化注入。

希望这会有所帮助:@Resource用于注入,而不是用于registration@Neo我知道,这就是我问这个问题的原因,我不知道为什么@Resource part会影响@Autowired part.@user1686407我们对应用程序的看法与您不同。你为什么不用一些样本bean和测试来复制它,如果它仍然不起作用,就把它发布在这里?@Neo我已经提供了所有的样本代码,而且代码工作得很好,我只是想知道它为什么起作用。为什么@autowireda;需要@Resource MyClas myB注入。