二、@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有兩個值