二、@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有两个值