Spring 註解實現Bean依賴注入之@Autowired

二、@Autowired:自動裝配

自動裝配,用於替代基於XML配置的自動裝配

基於@Autowired的自動裝配,默認是根據類型注入,可以用於構造器、字段、方法注入,使用方式如下:

@Autowired(required=true)  
構造器、字段、方法  

@Autowired默認是根據參數類型進行自動裝配,且必須有一個Bean候選者注入,

如果允許出現0個Bean候選者需要設置屬性“required=false”,“required”屬性含義和@Required一樣,

只是@Required只適用於基於XML配置的setter注入方式。

(1)、構造器注入:通過將@Autowired註解放在構造器上來完成構造器注入,默認構造器參數通過類型自動裝配,如下所示:

1、準備測試Bean,在構造器上添加@AutoWired註解:

package com.bean;

import org.springframework.beans.factory.annotation.Autowired;

public class TestBean {

	private String message;
	
	@Autowired
	private TestBean(String message){
		this.message = message;
	}
	
	public String getMessage() {
		return message;
	}
}

2、在Spring配置文件添加如下Bean配置:

<bean id="testBean" class="com.bean.TestBean">
	<constructor-arg index="0" ref="message"></constructor-arg>
</bean>

<bean id="message" class="java.lang.String">
	<constructor-arg index="0" value="hello"/>
</bean>

3、測試類如下:

@Test
public void autowiredTest(){
	TestBean bean = ctx.getBean("testBean", TestBean.class);
	Assert.isTrue("hello".equals(bean.getMessage()), "返回不相等");
}

在Spring配置文件中沒有對“testBean11”進行構造器注入和setter注入配置,而是通過在構造器上添加@ Autowired來完成根據參數類型完成構造器注入。


(2)、字段注入:通過將@Autowired註解放在構造器上來完成字段注入。

1、準備測試Bean,在字段上添加@AutoWired註解:

package com.bean;

import org.springframework.beans.factory.annotation.Autowired;

public class TestBean {

	@Autowired
	private String message;
	
	public String getMessage() {
		return message;
	}
}

2、在Spring配置文件(chapter12/dependecyInjectWithAnnotation.xml)添加如下Bean配置:

<bean id="testBean" class="com.bean.TestBean"/>

<bean id="message" class="java.lang.String">
	<!-- <constructor-arg name="original" value="hello"/> 也可以這樣寫-->
	<constructor-arg index="0" value="hello"></constructor-arg>
</bean>

3、測試方法如下:

@Test  
public void testAutowiredForField() {  
    TestBean bean = ctx.getBean("testBean", TestBean.class); 
    Assert.isTrue("hello".equals(bean.getMessage()),"返回不相等");
}  

字段注入在基於XML配置中無相應概念,字段注入不支持靜態類型字段的注入。
這樣寫的話,則要添加 <context:component-scan base-package="com.bean"/> 進行掃描,否則不會注入成功,同時別忘記添加

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans 
	                       http://www.springframework.org/schema/beans/spring-beans.xsd
	                       http://www.springframework.org/schema/context
           				   http://www.springframework.org/schema/context/spring-context-2.5.xsd">

(3)、方法參數注入:通過將@Autowired註解放在方法上來完成方法參數注入。

1、準備測試Bean,在方法上添加@AutoWired註解:

package com.bean;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

public class TestBean {


	private String message;
	
	private List<String> list;
	
	@Autowired(required = true)
	private void initMessage(String message,List<String> list){
		this.message = message;
		this.list = list;
	}


	@Override
	public String toString() {
		return "TestBean [message=" + message + ", list=" + list + "]";
	}
}


2、在Spring配置文件 添加如下Bean配置:

<bean id="testBean" class="com.bean.TestBean"/>
	  
<bean id="message" class="java.lang.String">
	<!-- <constructor-arg name="original" value="hello"/> -->
	<constructor-arg index="0" value="hello"></constructor-arg>
</bean>


<bean id="list" class="java.util.ArrayList">
<constructor-arg index="0">
	<list>
		<ref bean="message"/>
		<ref bean="message"/>
	</list>
</constructor-arg>
</bean>


3、測試方法如下:

@Test  
public void autowiredTest(){
	TestBean bean = ctx.getBean("testBean", TestBean.class);
	System.out.println(bean);
}

同樣別忘記了 添加 <context:component-scan base-package="com.bean"/>
方法參數注入除了支持setter方法注入,還支持1個或多個參數的普通方法注入,在基於XML配置中不支持1個或多個參數的普通方法注入,方法注入不支持靜態類型方法的注入。
 
注意“initMessage(String message, ArrayList<String> list)”方法簽名中爲什麼使用ArrayList而不是List呢?
--如果使用 List 則注入進去的list只有一個值,如果使用 ArrayList則注入進來的size有兩個值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章