@Autowired与@Resource区别及多实例使用

[TOC]

@Autowired与@Resource作用

@Autowired与@Resource都是向容器内注入bean的注解。

@Autowired与@Resource区别

  1. @Autowired是spring提供的。
    @Resource是jdk提供的。
  2. @Autowired注入方式为ByType,找不到即报错。
    @Resource注入方式为先ByName,若找不到再ByType,再找不到就报错。
@Autowired
private IDemoService iDemoService;
/*
这种方式会找IDemoService类型的bean,如果找不到则启动时报错
*/
@Resource
private IDemoService iDemoService;
/*
这种方式会先找名为"iDemoService"的bean,若找不到再找IDemoService类型的bean,再找不到则报错
@Resource
private IDemoService demoServiceImpl;(一般都会这么用,直接指定bean名,而不通过类型去匹配)
*/

多个实例解决篇

自定义接口IDemoService,自定义该接口的两个实现类:DemoServiceImplSecondDemoServiceImpl

基础示例代码:

public interface IDemoService {}
@Service
public class DemoServiceImpl implements IDemoService {}
@Service
public class SecondDemoServiceImpl implements IDemoService {}

当基础示例代码这样,且像这样注入实例时:private IDemoService iDemoService;,项目会启动报错(找到多个bean):

No qualifying bean of type 'com.example.demo.service.IDemoService' available: expected single matching bean but found 2: demoServiceImpl,secondDemoServiceImpl(@Autowired也报一样的错,只是日志略有不同)

正确使用(在基础示例代码上):

(通用)第一种方法:在某一个实现类上使用@Primary。表示多个实例时以此bean为主。

(通用)第二种方法:在注入时加入注解@Qualifier("demoServiceImpl")。表示当前注入的bean名为demoServiceImpl.

(通用)第三种方法:在某一个实现类上加入注解@Qualifier,在注入时也加入注解@Qualifier。则注入时表示注入的是持有@Qualifier的bean

(仅@Resource)第四种方法:注入时使用:@Resource(name = "demoServiceImpl")注解。表示注入指定bean名的实例。

(仅@Resource)第四种方法:注入时将实例名写成bean名。表示注入指定bean名的实例。

@Resource
private IDemoService demoServiceImpl;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容