首页 > 其他分享 >依赖注入之@Autowired和@Resource的区别

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

时间:2022-10-24 09:34:19浏览次数:52  
标签:依赖 Resource String Autowired Common test return public

依赖注入之@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原生的.

源码方面

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

标签:依赖,Resource,String,Autowired,Common,test,return,public
From: https://www.cnblogs.com/codeInk/p/Autowired-vs-Resource.html

相关文章