1. 程式人生 > >Spring @Autowired和@Qualifier註解

Spring @Autowired和@Qualifier註解

介紹:

@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相對路徑不清楚,可以使用絕對路徑,更加明瞭。以上的包名,配置檔案路徑都是博主的哦,自己注意修改。