private static ApplicationContext ctx = new ClassPathXmlApplicationContext("configLocation");
//1、Spring自带依赖注入注解
@Test
public void testRequiredForXmlSetterInject() {
TestBean testBean = ctx.getBean("testBean", TestBean.class);
Assert.assertEquals("hello", testBean.getMessage());
}
}
在XML配置文件中必须指定setter注入,否则在Spring容器启动时将抛出如下异常:
Java代码
1. org.springframework.beans.factory.BeanCreationException:
2. Error creating bean with name 'testBean' defined in class path resource [chapter12/dependecyInjectWithAnnotation.xml]: Initialization of bean failed;
3. nested exception is org.springframework.beans.factory.BeanInitializationException: Property 'message' is required for bean 'testBean'
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'testBean' defined in class path resource [chapter12/dependecyInjectWithAnnotation.xml]: Initialization of bean failed;
nested exception is org.springframework.beans.factory.BeanInitializationException: Property 'message' is required for bean 'testBean'
二、@Autowired:自动装配
自动装配,用于替代基于XML配置的自动装配,详见【3.3.3 自动装配】。
基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、字段、方法注入,使用方式如下:
Java代码
1. @Autowired(required=true)
2. 构造器、字段、方法
@Autowired(required=true)
构造器、字段、方法
@Autowired默认是根据参数类型进行自动装配,且必须有一个Bean候选者注入,如果允许出现0个Bean候选者需要设置属性“required=false”,“required”属性含义和@Required一样,只是@Required只适用于基于XML配置的setter注入方式。
(1)、构造器注入:通过将@Autowired注解放在构造器上来完成构造器注入,默认构造器参数通过类型自动装配,如下所示:
1、准备测试Bean,在构造器上添加@AutoWired注解:
Java代码
1. package cn.javass.spring.chapter12;
2. import org.springframework.beans.factory.annotation.Autowired;
3. public class TestBean11 {
4. private String message;
5. @Autowired //构造器注入
6. private TestBean11(String message) {
7. this.message = message;
8. }
9. //省略message的getter和setter
10. }
package cn.javass.spring.chapter12;
public class TestBean11 {
private String message;
@Autowired //构造器注入
private TestBean11(String message) {
this.message = message;
}
//省略message的getter和setter
}
2、在Spring配置文件(chapter12/dependecyInjectWithAnnotation.xml)添加如下Bean配置:
Java代码
1.
3、测试类如下:
Java代码
1. @Test
2. public void testAutowiredForConstructor() {
3. TestBean11 testBean11 = ctx.getBean("testBean11", TestBean11.class);
4. Assert.assertEquals("hello", testBean11.getMessage());
5. }
@Test
public void testAutowiredForConstructor() {
TestBean11 testBean11 = ctx.getBean("testBean11", TestBean11.class);
Assert.assertEquals("hello", testBean11.getMessage());
}
在Spring配置文件中没有对“testBean11”进行构造器注入和setter注入配置,而是通过在构造器上添加@ Autowired来完成根据参数类型完成构造器注入。
(2)、字段注入:通过将@Autowired注解放在构造器上来完成字段注入。
1、准备测试Bean,在字段上添加@AutoWired注解:
Java代码
1. package cn.javass.spring.chapter12;
2. import org.springframework.beans.factory.annotation.Autowired;
3. public class TestBean12 {
4. @Autowired //字段注入
5. private String message;
6. //省略getter和setter
7. }
package cn.javass.spring.chapter12;
import org.springframework.beans.factory.annotation.Autowired;
public class TestBean12 {
@Autowired //字段注入