詳細分析@Autowired註解與@resource註解的區別
背景:
今天下班路上看到一個大貨車,於是想到了裝配,然後腦海裡跳出了一個註解@Autowired(自動裝配),於是又想到最近工作專案用的都是@Resource註解來進行裝配。於是本著學什麼東西都要一鑽到底才能從菜鳥變大神的精神!!我就認真研究了一下,在此總結一波。以下內容先分別解釋一下兩個註解,再進行共同點與不同點的總結。
@Autowired
@Autowired為Spring提供的註解,需要匯入包org.springframework.beans.factory.annotation.Autowired。
@Autowired採取的策略為按照型別注入。
public class UserService {
@Autowired
private UserDao userDao;
}
如上程式碼所示,這樣裝配回去spring容器中找到型別為UserDao的類,然後將其注入進來。這樣會產生一個問題,當一個型別有多個bean值的時候,會造成無法選擇具體注入哪一個的情況,這個時候我們需要配合著@Qualifier使用。
@Qualifier告訴spring具體去裝配哪個物件。
public class UserService {
@Autowired
@Qualifier(name="userDao1")
private UserDao userDao;
}
這個時候我們就可以通過型別和名稱定位到我們想注入的物件。
@Resource
@Resource註解由J2EE提供,需要匯入包javax.annotation.Resource。
@Resource預設按照ByName自動注入。
public class UserService {
@Resource
private UserDao userDao;
@Resource(name="studentDao")
private StudentDao studentDao;
@Resource(type="TeacherDao")
private TeacherDao teacherDao;
@Resource(name="manDao",type="ManDao")
private ManDao manDao;
}
①如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常。
②如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常。
③如果指定了type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會丟擲異常。
④如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配。
總結:
Spring屬於第三方的,J2EE是Java自己的東西。使用@Resource可以減少程式碼和Spring之間的耦合。
兩者都可以寫在欄位和setter方法上。兩者如果都寫在欄位上,那麼就不需要再寫setter方法。
當存在多個型別,卻又沒有指定的時候,會報如下的錯誤:
嚴重: Exception sendingcontext initialized event to listener instance of classorg.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating beanwith name 'sequenceServiceImpl': Injection of resource dependencies failed;nested exception isorg.springframework.beans.factory.NoUniqueBeanDefinitionException: Noqualifying bean of type
Linux公社的RSS地址 :https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2019-01/156492.htm