Spring-02-注入和注解方式操作

Spring-02-注入和注解方式操作回顾:任务目标一. 依赖注入1. set方法注入1.1 基本类型值注入使用value1.2 引入类型值注入ref2.构造函数注入2.1 单个有参构造方法注入2.2. index属性:按参数索引注入2.3. type属性:按参数类型注入3. p名称空间注入4. spel注入5. 复杂类型注入二.使用注解1. 准备工作2. 使用注解2.1 引入Context的约束2.2 配置注解扫描2.3 使用注解3. 其他注解3.1 类头部可用的注解3.2 类头部可用的注解3.3 注入属性value值3.4 自动装配3.5 @Qualifier3.6 @Resource3.7 初始化和销毁方法三. Spring整合JUnit测试复习作业面试题

回顾:

1. Spring的简介
2. IOC和DI的简介和关系
3. Spring对象创建过程和配置

任务

1. 依赖注入详解
2. 使用注解的方式实现依赖注入
3. Spring中使用JUnit测试

目标

1. 掌握依赖注入的各种配置和属性
2. 掌握注解的方式实现依赖注入
3. 掌握在Spring中使用JUnit测试

一. 依赖注入

测试类:Person.java

创建配置文件:applicationContext-injection.xml

创建测试代码:InjectionTest.java

1. set方法注入
1.1 基本类型值注入使用value

配置:

 

测试代码:

 

1.2 引入类型值注入ref

创建 Car.java:

 

修改Person.java,在Person中引入Car:

 

配置:利用ref属性给 person的car属性赋值

 

测试: 使用之前测试用例即可!

2.构造函数注入
2.1 单个有参构造方法注入

在Person中创建有参构造函数:

 

配置:

 

测试:

 
2.2. index属性:按参数索引注入

参数名一致,但位置不一致时,使用 index

例如以下两个构造函数(第二个是新添加):

 

配置:使用 index 确定调用哪个构造函数

 

测试:

重新执行第一步的测试用例,执行结果调用了第一个构造函数

2.3. type属性:按参数类型注入

参数名和位置一致,但类型不一致时,使用type

例如以下两个构造函数(第二个是新添加):

 

配置:使用type指定参数的类型

 

测试:

重新执行前面的测试用例,执行结果调用了第二个构造函数

3. p名称空间注入

导入p名称空间:

使用p:属性名 完成注入,走set方法

配置:

 

测试:

 

4. spel注入

spring Expression Language:spring表达式语言

配置:

 

测试

 

5. 复杂类型注入

创建配置文件:application-collection.xml

创建测试代码:CollectionTest.java

创建测试实体类:TestCollection

创建TestCollection:

 

配置:

 

测试:

 

二.使用注解

使用注解的方式完成IOC

1. 准备工作
2. 使用注解
2.1 引入Context的约束

​ 参考文件位置:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html 40.2.8 the context schema

配置:

 
2.2 配置注解扫描

在applicationContext.xml中配置:

指定扫描 下所有类中的注解,扫描包时,会扫描包所有的子孙包.

 

2.3 使用注解

在Person类的头部添加如下注解

 

测试:

 

3. 其他注解

介绍其他常用注解,测试方式同前

3.1 类头部可用的注解
 

3.2 类头部可用的注解

指定对象作用域

 

3.3 注入属性value值

1.设置成员变量上:通过反射给变量赋值

 

@Value("name值") 等同于 @Value(value="name值")

2.加在set方法上:通过set方法赋值

 
3.4 自动装配
  1. @Autowired

使用 @Autowired 自动装配对象类型的属性: 下面的Person中的Car使用了自动装配

 

装配类:

 

注意: 以上操作会出现一个问题,如果Car是接口,且Car只有一个实现类,那么@Autowired会自动将实现类装配给Person的car变量上,但是如果Car是接口,并且有两个以上实现类,那么自动装配就会报错,无法选择由哪个实现类赋值.所以需要配合另一个注释@Qualifier("bean name"), 这个属性可以将@Autowired按类型赋值改成按bean名字赋值.

3.5 @Qualifier
 

3.6 @Resource

@Resource 是java的注释,但是Spring框架支持,@Resource指定注入哪个名称的对象

@Resource("name") == @Autowired + @Qualifier("name")

 

3.7 初始化和销毁方法

初始化和销毁方法等同于配置文件添加的init-method和destroy-method功能,

例:Person类中init方法和destroy方法添加如下注解:

 

三. Spring整合JUnit测试

spring整合junit,为我们提供了方便的测试方式

1、导包:在spring-02-annotation项目中再加入如下包

spring-test-4.2.8.jar

2、创建测试类

 

复习

1. Spring的基本配置
2. 代码实现Spring创建对象过程  

作业

1. 创建汽车类(Car)和引擎接口(Engine)
2. 创建两个引擎的实现类V6Engine和V8Engine
3. 使用依赖注入的方式显示V6的汽车和V8的汽车奔跑(running)的效果
4. 使用BeanFactory和ApplicationContext分别加载以上的类
5. 使用不同的生命周期创建上面的类并使用JUnit测试不同之处
6. 使用注解的方式再实现一次

面试题

1. 在Spring中如何注入基本数据类型
2. @Component注解的作用
3. @Resource注解和@Autowired注解的作用和区别
4. Spring如何集成JUnit