一、@Resource注解和@Autowired注解的區(qū)別
@Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
@Autowird注解默認(rèn)通過byType方式注入,而@Resource注解默認(rèn)通過byName方式注入
@Autowired注解注入的對象需要在IOC容器中存在,否則需要加上屬性required=false,表示忽略當(dāng)前要注入的bean,如果有直接注入,沒有跳過,不會(huì)報(bào)錯(cuò)
對于byName和byType方式不太熟悉的可以看一下這里:Spring中的byName與byType
簡單來說,byName就是變量名去匹配bean的id屬性,而byType則是變量類型去匹配bean的class屬性
@Autowired
private UserService userService;
此處byName就是拿變量名userService去匹配IOC容器的iduserService,匹配成功;而byType就是拿變量類型UserService去匹配IOC容器的idcom.test.UserService.UserServiceImpl,因?yàn)閁serServiceImpl是UserService實(shí)現(xiàn),所以也匹配成功。
延伸閱讀:
二、@Autowird注解的使用
步驟:@Autowird默認(rèn)的注入方式為byType,也就是根據(jù)類型匹配,當(dāng)有多個(gè)實(shí)現(xiàn)時(shí),則通過byName注入,也可以通過配合@Qualifier注解來顯式指定name值,指明要使用哪個(gè)具體的實(shí)現(xiàn)類
舉例:
首先有一個(gè)接口UserService和兩個(gè)實(shí)現(xiàn)類UserServiceImpl1和UserServiceImpl2,并且這兩個(gè)實(shí)現(xiàn)類已經(jīng)加入到Spring的IOC容器中了
@Service
public class UserServiceImpl1 implements UserService
@Service
public class UserServiceImpl2 implements UserService
1通過@Autowired注入使用
@Autowired
private UserService userService;
根據(jù)上面的步驟,可以很容易判斷出,直接這么使用是會(huì)報(bào)錯(cuò)的
原因:首先通過byType注入,判斷UserService類型有兩個(gè)實(shí)現(xiàn),無法確定具體是哪一個(gè),于是通過byName方式,這里的變量名userService也無法匹配IOC容器中id(此處指的userServiceImpl1和userServiceImpl2),于是報(bào)錯(cuò)。
注意:通過注解注入到IOC容器的id值默認(rèn)是其類名首字母小寫