Autowired与Resource 对比

废话不多说,上干货!

差异对比:

同:

用来装配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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值