@Autowired是spring的注解,@Resource是j2ee的注解,他们的作用都是用于注入
1、通用场景
首先创建一个service类
public interface TestService {
void injectionTest(String type);
}
@Service
public class TestServiceImpl implements TestService {
@Override
public void injectionTest(String type) {
System.out.println("方法被调用,"+ type +"注解注入成功!");
}
}
然后在控制层创建调用方法,首先使用@Autowired注解
@RestController
@RequestMapping("/test")
public class TestController {
private static Logger logger = LoggerFactory.getLogger(TestController.class);
@Autowired
private TestService testService;
@GetMapping("/myTest")
public void test(String type){
testService.injectionTest(type);
}
}
运行后发现正常运行
改成@Resource注解再次运行该方法
@RestController
@RequestMapping("/test")
public class TestController {
private static Logger logger = LoggerFactory.getLogger(TestController.class);
@Resource
private TestService testService;
@GetMapping("/myTest")
public void test(){
testService.injectionTest();
}
}
可以发现这种情况下@Autowired注解与@Resource注解并无区别。
2、一个业务接口对应两个或多个业务实现类
新建一个TestNewServiceImpl实现TestService,如下所示
@Service
public class TestNewServiceImpl implements TestService {
@Override
public void injectionTest(String type) {
System.out.println("方法被调用,"+ type +"注解注入成功!");
}
}
这时候有两个业务实现类都实现了UserService接口
使用@Autowired注解
运行后报错
报错信息显示很明确,有两个业务实现类,系统不知道该选择哪一个,这时候需要使用@Qualifier注解来指定所选的业务实现类,如下:
先给service实现类设置别名
然后@Qualifier按照设置的别名指定所选的业务实现类
运行后发现调用成功
使用@Resource注解
删除设置的别名后运行发现同样报错
恢复设置的别名,然后@Resource注解同样指定别名后运行
总结
@Autowired是根据类型(byType)注入的,然后当找到type类型的bean时,如果发现有异常(不唯一等),会再去根据name去找bean注入。
@Resource默认byName去找bean,还提供了name和type一起设置或者单一设置