背景:
今天下班路上看到一個大貨車,於是想到了裝配,然后腦海里跳出了一個注解@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
作者: 經典雞翅
聲明:本文版權歸作者所有,歡迎轉載,轉載請注明出處。