依赖注入之@Autowired和@Resource的区别

依赖注入即由容器动态的将对象的依赖注入到该对象中

–这是Spring的几个核心特性之一

在使用的时候, 一般默认使用@Autowired注解, 但是其实根据场景还可以使用@Resourse注解, 那么这俩注解有什么区别呢?

作用方式不一样

@Autowired注解是通过tag的方式进行匹配的, 因此在注入接口(实际是接口实现类)时, 需要存在一对一的关系,也就是一个接口只能由一个实现类, 否则就会报错.

@Resource注解是通过name的方式进行注入的, 因此在注入接口时, 会根据名称匹配对应的实现类, 具体可以参照下面的代码:

接口以及实现类:

public interface Common {
     public String test();
}

@Service
public class A implements Common {
    @Override
    public String test() {
        return "this is A!!!";
    }
}

@Service
public class B implements Common {
    @Override
    public String test() {
        return "this is B!!!";
    }
}

测试Controller

@RestController
public class TestController {
    @Resource
    private Common a;
    @Resource
    private Common b;

    @RequestMapping("/test")
    public String test(){
        return a.test();
    }
    @RequestMapping("/test2")
    public String test2(){
        return b.test();
    }
}

可以看到注入同一个接口的时候, 可以根据不同的名称a,b去匹配到Common的不同实现类

而这套代码如果使用@Autowired注解则会报错! 除非结合其他方式进行匹配, 例如可以结合@Qualify("")以及@Service(""),代码如下:

接口实现类:

@Service("A")
public class A implements Common {
    @Override
    public String test() {
        return "this is A!!!";
    }
}
@Service("B")
public class B implements Common {
    @Override
    public String test() {
        return "this is B!!!";
    }
}

测试Controller

@RestController
public class TestController {
    @Autowired
    @Qualifier("A")
    private Common a;
    @Autowired
    @Qualifier(value = "B")
    private Common b;

    @RequestMapping("/test")
    public String test(){
        return a.test();
    }
    @RequestMapping("/test2")
    public String test2(){
        return b.test();
    }
}

但是这种情况下, 是进行匹配@Service中写的值进行匹配的, 也不是根据实现类的名称~

来源不一样

这个, 其实在导包的时候, 注意一下就能发现, @Autowired注解是Spring写的注解, 而@Resource则是Java原生的.

源码方面

有兴趣的可以自己看一下, 我暂时没到这个深度~

原文地址:http://www.cnblogs.com/codeInk/p/Autowired-vs-Resource.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性