@Autowired默认注入问题?

ioc容器存在“同一类型”通过@Bean生成的对象和@Component注解扫描的对象,使用@Autowired注解导入ioc容器中该类型对象,问题是得到的对象是通过那个注解生成的?跟两个注解的优先级相关吗?还是其他什么原因?

看了楼上两位的说法,你所谓的“同一类型”感觉我还是没太理解。我结合楼上两位的说法做了测试:

以@Component和@Bean注册同一个类A:


定义组件A:

定义Bean A,这里我先把Bean注释掉,等会说为啥:

在测试类中注入两次A:

运行结果:

然后令人惊讶的事实是,我把Bean的注释放开:

此时运行:

震惊,两次的运行结果都输出了name为bean。

综上,@Component和@Bean同时注册一个类时,感觉@Bean所谓的“优先级”更高。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-08-11
你好,很高兴回答你的问题。如果Spring管理了两个同类型的对象。通过@Autowired来注入的话会报错。因为Spring不知道要选哪个。
可以在要选的那个对象注解处同时加注解@Primary。这样@Autowired处就会注入用@Primary注解的对象。
如果有帮助到你,请点击采纳。
第2个回答  2020-08-11
没有优先级说法
@Component
This is a generic annotation and can be applied to any class of the application to make it a spring managed component(simply, generic stereotype for any spring managed component). when the classpath is scanned by the spring’s component-scan (@ComponentScan) feature, it will identify the classes annotated with @Component annotation (within the given package) and create the beans of such classes and register them in the ApplicationContext. @Component is a class level annotation and its purpose it to make the class as spring managed component and auto detectable bean for classpath scanning feature.
if you want to know more about @Component and other stereo type annotations, it is recommended to look at this article.

@Bean
@Bean is used to explicitly declare and register a bean (as a configuration bean) in Spring IOC container that is returned from a method. @Bean is a method level annotation and it is used within a class that is annotated with @Configuration. Simply, @Bean annotation is used to register the bean returned by a method as a spring configuration bean in IOC Container. @Bean is only a method level annotation and it cannot be used with classes and object declaration.
@Bean annotation indicates that a method produces a bean that should be managed by the Spring container.
To declare a bean, simply annotate a method with the @Bean annotation. When JavaConfig encounters such a method, it will execute that method and register the return value as a bean within a ApplicationContext. By default, the bean name will be the same as the method name.The following is a simple example of a @Bean method declaration.

@Configurationpublic class ApplicationConfig { @Bean
public User adminUserProfile()
{
return new User("Chathuranga","Tennakoon");
}
}

In the ApplicationConfig class, you can see that we first use the @Configuration annotation to inform Spring that this is a Java-based configuration file. Afterward, the @Bean annotation is used to declare a Spring bean and the DI requirements.
The @Bean annotation is equivalent to the <bean> tag, the method name is equivalent to the id attribute within the <bean> tag.
I hope that after reading this article, you have got a clear idea about the real purpose and use of @Bean and @Component annotations.
第3个回答  2020-08-13
搞不懂这个问题有何意义?同一类型还要分别用两个不同的注解来注入容器?
相似回答