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注入。