@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