介紹:
@Autowired和@Qualifier是Spring項目中比較常用的兩個注解。一般在同一個實作Bean可以在不同的平台使用,Controller調用Service,Service調用DAO。其中很多執行個體都是使用@Autowired自動實作,但是如果同一份Bean執行個體有不同的構造器來建立的時候,使用Autowired自動建立Bean執行個體IOC容器就分不清了,這時候需要使用@Qualifier來指定特定的bean執行個體構造方法。
@Autowired可以标注類中引用屬性,構造方法,和普通方法。用Autowired标記的屬性和方法,都會自動建立實體,當然對于方法中的參數意思是IOC容器自動建立bean實體,并負責給參數清單中的引用了。
@Autowired标記的方法都會在實體建立的時候,自動調用。
執行個體:
1.建立兩個實體bean,代碼如下:
QualifierBean實體Bean實作代碼
package com.yangwan.beans;
public class QualifierBean {
private String idstr;
private int value;
private String defaultFlag = "預設辨別";
public QualifierBean(String idstr, int value){
this.idstr = idstr;
this.value = value;
}
public QualifierBean(String idstr,int value,String defaultFlag){
this.idstr = idstr;
this.value = value;
this.defaultFlag = defaultFlag;
}
public String getIdstr() {
return idstr;
}
public void setIdstr(String idstr) {
this.idstr = idstr;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public void printQualifierBeanInformation(){
System.out.println(this);
System.out.println("idstr: "+this.idstr+"\nvalue: "+
this.value+"\ndefaultFlag: "+this.defaultFlag);
}
}
QualifierTestBean實體Bean代碼實作
package com.yangwan.beans;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class QualifierTestBean {
private QualifierBean twoqb;
private QualifierBean threeqb;
public QualifierTestBean(){
}
//利用兩個參數的構造器自動建立QualifierBean執行個體
@Autowired
public void setTwoqbTest(@Qualifier("twoparaqualifierbean")QualifierBean twoqb){
this.twoqb = twoqb;
}
@Autowired
public void setThreeqbTest(@Qualifier("threeparaqualifierbean")QualifierBean threeqb){
this.threeqb = threeqb;
}
public void printQualifierTestBeanInformation(){
this.twoqb.printQualifierBeanInformation();
this.threeqb.printQualifierBeanInformation();
}
}
注解:QualifierBean中有三個屬性,分别為idstr,value和defaultFlag。有兩個構造函數,分别帶有兩個參數和三個參數,帶有三個參數的構造函數會修改defaultFlag屬性。最後有個printQualifierBeanInformation()方法來輸出bean的資訊。在QualifierTestBean中,又twoqb和threeqb兩個屬性,都是有@Autowired自動建立,由@Qualifier指定建立的構造函數。
接下來看下配置檔案:
<context:annotation-config />
<context:component-scan
base-package="com.yangwan.beans"/>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!-- 利用@Qualifier來自動建立Bean執行個體,不需要設定id,隻需要設定class便可 -->
<bean class="com.yangwan.beans.QualifierBean">
<qualifier value="twoparaqualifierbean"></qualifier>
<constructor-arg index="0" value="001"></constructor-arg>
<constructor-arg index="1" value="22"></constructor-arg>
</bean>
<bean class="com.yangwan.beans.QualifierBean">
<qualifier value="threeparaqualifierbean"></qualifier>
<constructor-arg name="idstr" value="002"></constructor-arg>
<constructor-arg name="value" value="23"></constructor-arg>
<constructor-arg name="defaultFlag" value="修改Flag"></constructor-arg>
</bean>
<bean id="qualifiertestbean" class="com.yangwan.beans.QualifierTestBean"></bean>
注解:加上<context:annotation-config />開啟注解。
加上<context:component-scan base-package="com.yangwan.beans"/>掃描包
測試函數:
package com.yangwan.test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import com.yangwan.beans.Boss;
import com.yangwan.beans.QualifierTestBean;
public class MainTest {
public static void main(String[] args) {
String[] locations = {"file:C:/Users/bw/Desktop/yw/AutowireTestPro/src/main/resources/spring/application-config.xml"};
ApplicationContext ctx =
new ClassPathXmlApplicationContext(locations);
Boss boss = (Boss) ctx.getBean("boss");
System.out.println(boss);
boss.printInformation();
QualifierTestBean qtb = (QualifierTestBean)ctx.getBean("qualifiertestbean");
qtb.printQualifierTestBeanInformation();
}
}
注解:在建立ApplicationContext的時候,如果配置檔案的classpath相對路徑不清楚,可以使用絕對路徑,更加明了。以上的包名,配置檔案路徑都是部落客的哦,自己注意修改。