SpringBoot里@autowired的Bean是从哪儿获得的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot里@autowired的Bean是从哪儿获得的相关的知识,希望对你有一定的参考价值。

你先找到标注了@SpringBootApplication的主类,注意看它的package。这个@SpringBootApplication会声明让Spring去扫描该package里以及所有子package里的类,如果扫到的类标注有@Component/@Controller/@Service/@Repository,那就把它加入Spring容器,这样你在其他任何地方使用@Autowired标注就能自动从Spring容器里把这个类找出来并注入进去直接使用。
package com.demo;
@SpringBootApplication
public class Application
// ...
参考技术A 在定义DAO和Service等其他bean的时候一般都会指定一个名称 如下:

@Repository("fnFunctionBasicDAO")
public class FnFunctionBasicDAOImpl 。。。。

@Service("menuManager")
public class MenuManager。。。。。

使用resource注入就可以直接使用这个名字

我一般习惯于使用下面的方式注入
@Autowired
@Qualifier("menuManager")
private MenuManager menuManager;

追问:

谢谢啊,那我为什么在dao方法上加上@Resource()就报Error creating bean with name 'UserinfoDAO' defined in class path resource [applicationContext.xml]: Post-processing failed of bean type [class com.zyx.dao.impl.UserinfoDAOImpl] failed; nested exception is java.lang.IllegalStateException: @Resource annotation is not supported on static fields

什么原因?

回答:

@Resource annotation is not supported on static fields,你的UserinfoDAO是static的?

追问:

UserinfoDAO是一个接口,UserinfoDAOImpl实现的,是不是@Resource()不能加在方法上,只能加在类上?我把它放到类上就不报错了

回答:

是的,是加在类上面本回答被提问者采纳

SpringBoot中的autowired注解可以修饰接口吗?

参考技术A 对于这个问题,从本人的经验来看,接口不能实例化,autowired的本质是从IOC容器中将实例赋值给成员变量,所以autowired自然是不能修饰接口的。

但是事实上,autowired可以修饰接口,是因为这个接口有类实现它。

请看例子:

如果仅是一个接口VideoService,在Controller中注入该注解,在启动应用的时候,会报如下的错误:

接着如果有类实现这个接口,就不会报错。

这里引申出接口有多个实现类的注入方式,启动时会报错:

建议使用@Primary注解使其优先被选择,或者使用@Qualifier指定注入一个Bean。

以上是关于SpringBoot里@autowired的Bean是从哪儿获得的的主要内容,如果未能解决你的问题,请参考以下文章

Springboot @Autowired用法

springboot Autowired BeanNotOfRequiredTypeException

SpringBoot@Autowired注入静态成员变量报空指针异常

彻底搞明白Spring中的自动装配和Autowired

SpringBoot常用注解:@Resource/@Component与@Autowired的使用

SpringBoot中的autowired注解可以修饰接口吗?