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
版權宣告:本文為博主原創文章,轉載請附上博文連結!