[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;