关于@Autowired@Resource@Qualifier

参考博文:https://blog.csdn.net/revent/article/details/49203619
【关于@Autowired@Resource@Qualifier】@Autowired根据类型注入@Resource默认根据名字注入,其次按照类型搜索
@Autowired@Qualifile("userService")两个结合起来可以根据名字注入
标注@Service;当使用@Autowired时,就会自动找到这个类型以及他的子类型。如果...ServiceImpl实现了...Service,那么就可以找到他。不过这样有一个缺点,就是当..Service实现类有两个以上的时候,就会产生冲突。
@Resource默认情况下是按照名称进行匹配的,如果没有找到相同名称的Bean,则会按照类型进行匹配。在UserSeriveImpl上标注@Service,则其默认名字为userSeriveSerImpl;没有找到名字,再按类型搜索,进行了两次搜索,速度下降。
@Autowired @Qualifie("userService") 是直接按照名字进行搜索,也就是说,对于UserServiceImpl 上面@Service注解必须写名字,不写就会报错,而且名字必须是@Autowired @Qualifie("userService") 保持一致。如果@Service上面写了名字,而@Autowired @Qualifie() ,一样会报错。

通常情况一个Bean的注解写错了,会报下面这些错误,最为常见,
No bean named 'user' is defined,这个表示没有找到被命名为user的Bean,通俗的说,就是名字为user的类型,以及它的子类型,出现这个错误的原因就是注入时候的类型名字为user,而搜索的时候找不到,也就是说可能那个搜索的类型,并没有命令为user,解决办法就是找到这个类型,去命令为user,
下面这个错误也常见,
No qualifying bean of type [com.service.UserService] found for dependency:
这个错误的原因就是类型上面没有加@Service这个注入,不仅仅是@Service,如果是其他层也会出现这个错误,这里我是以Service为例子说明,如果是DAO层就是没有加@Repository,Controller层,则是没有加@Controller。
还有,如果你还是想再简单点,无论是DAO,Controller,Service三个层,都可以用这个注解,@Component,这个注解通用所有的Bean,这个时候你可能会说了,有通常的为什么用的人少呢,那是因为MVC这个分层的设计原则,用@Repository,@Service,@Controller,这个可以区别MVC原则中的DAO,Service,Controller。便于识别。



    推荐阅读