1.@Autowired默認按類型裝配(這個注解是屬於spring的),默認情況下必須要求依賴對象必須存在,如果要允許null 值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用,如下:
@Autowired()
@Qualifier("baseDao")
private BaseDao baseDao;
2.@Resource(這個注解屬於J2EE的),分為以下幾種情況
1)默認安照名稱進行裝配,名稱可以通過name屬性進行指定
如:
1 @Resource(name="student") //這里的student是指bean的ID 2 private Student student;
2)如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行按照名稱查找
如:
@Resource() //未指定name,默認取將要注入屬性的字段名,如下Student是類類型,student是屬性名也就是字段名
private Student student;
3)如果注解寫在setter方法上默認取屬性名進行裝配。
如:
@Resource(name="student")
public void setStudent(Student student) {
this.student = student;
}
4)當找不到與名稱匹配的bean時才按照類型進行裝配。
如:
java代碼如下:
@Resource()
private Student student;
spring.xml如下:
<bean id="student1" class="com.spring.chapter8.Student">
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
</bean>
在Spring.xml文件中並沒有student 的bean。當找不到與名稱匹配的bean時才按照類型進行裝配。我們運行也會成功。
但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。否則會報錯
運行結果如下:
spring.xml如下:
java代碼如下:
運行結果:
總結:
1.@Resource注解既可以用在setter中也可以用在屬性當中,當Resource指定屬性name名字時,就只會按照指定的name去查找bean,否則會報錯。
2.當注解寫在字段上時,@Resource不指定name,默認取字段名進行按照名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。如果最后都找不到與名稱匹配的bean時才按照類型進行裝配。我們運行也會成功
3.推薦使用:@Resource注解在字段上,且這個注解是屬於J2EE的,減少了與spring的耦合。最重要的這樣代碼看起就比較優雅。