【開發(fā)日記】Spring中@Autowired和@Resource
1- 提供方不同
1.1、@Autowired注解由Spring提供,所屬包:
org.springframework.beans.factory.annotation1.2、@Resource注解由JDK提供,所屬包:
javax.annotation2- 導(dǎo)入方式不同
2.1、@Autowired注解只能按照類型注入,如果需要使用此注解按名稱注入的話則需要搭配@Qualifier來實(shí)現(xiàn)按名稱注入。
2.2、@Resource注解默認(rèn)使用名稱注入,但也可以使用類型注入。
名稱注入:
@Resource(name="AutowiredTestImpl1")
private?AutowiredTest?autowiredTest;類型注入:
@Resource(type=AutowiredTest.class)
private?AutowiredTest?autowiredTest;類型和名稱同時(shí)指定:
@Resource(type=AutowiredTest.class,name?=?"AutowiredTestImpl1")
private?AutowiredTest?autowiredTest;當(dāng)類型與名稱同時(shí)指定時(shí),會(huì)找到唯一符合的bean進(jìn)行注入。
強(qiáng)制注入默認(rèn)情況下,會(huì)在應(yīng)用啟動(dòng)時(shí)@Autowired和@Resource注解會(huì)在IOC容器中查找相對(duì)應(yīng)的Bean,如果沒有則報(bào)錯(cuò)。
使用@Autowired注解可以設(shè)置非強(qiáng)制注入,該注解的required屬性默認(rèn)值為true,表示強(qiáng)制注入;將該屬性值改為false后,在應(yīng)用啟動(dòng)時(shí)如果有這個(gè)Bean就注入,沒有就跳過,不會(huì)報(bào)錯(cuò)。
@Autowired(required?=?false)
private?AutowiredTest?autowiredTest;多個(gè)符合條件的Bean1- 問題
使用@Autowired時(shí)如果容器中有兩個(gè)或兩個(gè)以上的Bean符合注入條件,會(huì)報(bào)錯(cuò)如下:
expected?single?matching?bean?but?found?2表示期望一個(gè)Bean,但是找到兩個(gè)。
2- 解決
2.1、使用@Primary注解設(shè)置主要Bean;當(dāng)發(fā)現(xiàn)多個(gè)符合條件的Bean時(shí),那么優(yōu)先注入被@Primary注解的Bean。
@Component
@Primary
public?class?AutowiredTestImpl1?implements?AutowiredTest...2.2、配合@Qualifier注解,實(shí)現(xiàn)的效果如同使用@Resource對(duì)name和type都進(jìn)行了設(shè)置。
@Autowired
@Qualifier("AutowiredTestImpl1")
private?AutowiredTest?autowiredTest;