1. 程式人生 > >@Autowired註解與@resource註解的區別(十分詳細)

@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 

 

作者: 經典雞翅

宣告:本文版權歸作者所有,歡迎轉載,轉載請註明出處。