[TOC]
@Autowired与@Resource作用
@Autowired与@Resource都是向容器内注入bean的注解。
@Autowired与@Resource区别
-
@Autowired
是spring提供的。
@Resource
是jdk提供的。 -
@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
,自定义该接口的两个实现类:DemoServiceImpl
、SecondDemoServiceImpl
基础示例代码:
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;