废话不多说,上干货!
差异对比:
同:
用来装配bean, 可作用于字段上, 也可以作用于setter方法上.
异:
Autowired
1、Spring的注解.
2、默认情况下要求对象必须存在, 它要求依赖对象必须存在. 若允许null值, 可以设置它的required为false.
3、默认按照类型进行装配注入. 如果想按照名称进行装配的话, 需要与Qualifer注解搭配使用.
Resource
1、J2EE的注解.
2、默认按照名称来装配注入, 只有找不到与名称匹配的bean才会按照类型来注入.
什么是type,什么是name
简单说:
ByType就是根据所属类:UserService-》UserService
ByName是根据类转换成的名字,首字母转为小写:UserService-》userService
场景验证:
1、一对一,两个都可以使用,没区别。
demo1:
@RestController
public class UserController {
@Autowired
// @Resource
private UserServiceImpl1 userServiceImpl1;
@RequestMapping(value = "test")
public String test(){
return userServiceImpl1.test();
}
}
demo2:
@RestController
public class UserController {
// @Autowired
@Resource
private UserService userService;
@RequestMapping(value = "test")
public String test(){
return userService.test();
}
}
@Service
public class UserServiceImpl1 implements UserService {
@Override
public String test() {
return "UserServiceImpl1.test()";
}
}
访问:http://localhost:8080/test
返回结果:UserServiceImpl1.test()
2、一对多
demo1:
@RestController
public class UserController {
@Autowired
// @Resource
private UserServiceImpl1 userServiceImpl1;
@RequestMapping(value = "test")
public String test(){
return userServiceImpl1.test();
}
}
demo2:
@RestController
public class UserController {
// @Autowired
@Resource
private UserService userService;
@RequestMapping(value = "test")
public String test(){
return userService.test();
}
}
@Service
public class UserServiceImpl1 implements UserService {
@Override
public String test() {
return "UserServiceImpl1.test()";
}
}
@Service
public class UserServiceImpl2 implements UserService{
@Override
public String test() {
return "UserServiceImpl2.test()";
}
}
访问:http://localhost:8080/test
结果:
demo1:本质也是一对一的情况,均成功返回:UserServiceImpl1.test()
demo2:
Autowired编译期报错
Autowired增加别名后恢复正常,成功返回:UserServiceImpl1.test()
Resource编译期不报错
Resource启动报错
3、没有@Service
@RestController
public class UserController {
// @Autowired
@Resource
private UserService userService;
@RequestMapping(value = "test")
public String test(){
return userService.test();
}
}
public interface UserService {
public String test();
}
访问:http://localhost:8080/test
结果:
Autowired编译期报错,增加required = false后,跳过检查,运行时报错:NPE
Resource编译期不报错,启动报错
总结:
一对一情况无区别
一对多情况,要用autowired需要制定别名,定位到具体实现类。Resource不会报错,但也无法启动。
没有注解情况下,autowired会在编译期报错,Resource不会报错。
这么看,我反而建议用Autoried,错误解决在编译期。
参考文档:
https://www.cnblogs.com/wuqinglong/p/10155280.html