1. 程式人生 > >spring資源注入註解 @Autowired @Qualifier @Resource的差異性

spring資源注入註解 @Autowired @Qualifier @Resource的差異性

spring物件(@Controller @Service @Component @Repository)在注入其他spring物件(@Service @Component @Repository)的時候,可以在成員變數上使用注入註解@Autowired或者@Resource.如果被注入資源是繼承了介面的模式,並且實現類有多個的情況下,那麼@Autowired或者@Resource就會有較大的差異性,如下:

@Service("myServiceImpl1")
public class MyServiceImpl1 implements IService{
}

@Service("myServiceImpl2")
public class MyServiceImpl2 implements IService{
}

如果需要在Controller中注入MyServiceImpl1,方式如下: 
方式一:

@Controller
public class MyController{
    @Resource(name="myServiceImpl1")
    private IService serviceImpl;
}

@Controller
public class MyController{
    @Autowired
    @Qualifer("myServiceImpl1")
    private IService serviceImpl;
}

這種方式是最基本的使用方式,都可以達到注入資源的目的 
差異1: 
@Resource預設是按照資源的名稱(name)查詢並注入的 
@Autowired預設是按照資源的型別(class)查詢並注入的 
因此採用@Resource一般都會帶上資源的名稱確保資源的唯一性,採用@Autowired如果存在多個實現類的情況下,通過型別無法確定唯一性,需要結合@Qualifer註解通過資源名稱確定唯一性

方式二:

@Controller
public class MyController{
    @Resource
    private IService myServiceImpl1;
}

@Controller
public class MyController{
    @Autowired
    private IService myServiceImpl1;
}

這種方式在沒有指定具體的資源名稱情況下,也可以達到注入資源的目的,但是和第一種方式的區別是,加註解的屬性名稱必須和被注入資源的名稱保持一致,但@Resource沒有新增name屬性,@Autowired沒有新增@Qualifer的情況下,預設查詢資源的方式是不同的 
差異2: 
@Resource沒有指定資源名稱(name)時,預設會把屬性的名稱作為資源名稱,類似於@Resource(name=”myServiceImpl1”),如果還是沒有找到,會回退到資源型別的方式進行資源注入,類似於按照@Autowired方式繼續注入 
@Autowired沒有增加@Qualifer,如果查詢型別有多個實現,會按照名稱的方式進行資源注入,類似於按照@Resource方式繼續注入

方式三: 
如果存在資源的實現有多個,注入時不指定名稱,未來可以隨意切換資源時,可以用該方式

@Service("myServiceImpl1")
@Primary
public class MyServiceImpl1 implements IService{
}

@Service("myServiceImpl2")
public class MyServiceImpl2 implements IService{
}

在實現資源的時候,如果資源有多個,可以將其中一個增加@Primary作為主資源,那麼在Controller注入該資源時,可以不指定資源名稱,如下:

@Controller
public class MyController{
    @Resource
    private IService serviceImpl;
}

@Controller
public class MyController{
    @Autowired
    private IService serviceImpl;
}

可以看出@Resource和@Autowired在該方式下都是可行的,而且屬性名稱和資源名稱可以不一樣,未來如果需要切換資源,只需要將@Primary換個資源即可。

綜上結論 
@Resource和@Autowired的差異
--------------------- 
作者:xujian_2001 
來源:CSDN 
原文:https://blog.csdn.net/xujian_2001/article/details/79050429 
版權宣告:本文為博主原創文章,轉載請附上博文連結!