基于XML管理bean
实验一 [重要]创建bean
实验二 [重要]获取bean
实验三 [重要]给bean的属性赋值:setter注入
实验四 [重要]给bean的属性赋值:引用外部已声明的bean
实验五 [重要]给bean的属性赋值:内部bean
实验六 [重要]给bean的属性赋值:引入外部属性文件
实验七 给bean的属性赋值:级联属性赋值
实验八 给bean的属性赋值:构造器注入
实验九 给bean的属性赋值:特殊值处理
实验十 给bean的属性赋值:使用p名称空间
实验十一 给bean的属性赋值:集合属性
实验十二 自动装配
实验十三 集合类型的bean
实验十四 FactoryBean机制
实验十五 bean的作用域
实验十六 bean的生命周期
实验一 [重要]创建bean
1、实验目标和思路
①目标
由 Spring 的 IOC 容器创建类的对象。
②思路
2、创建Maven Module
<!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
3、创建组件类
package com.atguigu.ioc.component;
public class HappyComponent {
public void doWork() {
System.out.println("component do work ...");
}
}
4、创建 Spring 配置文件
5、配置组件
1.
2.
bean标签:通过配置bean标签告诉IOC容器需要创建对象的组件是什么
id属性:bean的唯一标识
class属性:组件类的全类名
6、创建测试类
public class IOCTest {
// 创建 IOC 容器对象,为便于其他实验方法使用声明为成员变量
private ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void testExperiment01() {
// 从 IOC 容器对象中获取bean,也就是组件对象
HappyComponent happyComponent = (HappyComponent) iocContainer.getBean("happyComponent");
happyComponent.doWork();
}
}
7、无参构造器
Spring 底层默认通过反射技术调用组件类的无参构造器来创建组件对象,这一点需要注意。如果在需要无参构造器时,没有无参构造器,则会抛出下面的异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'happyComponent1' defined in class path resource [applicationContext.xml]: Instantiation of bean failed;
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.atguigu.ioc.component.HappyComponent]: No default constructor found;
nested exception is java.lang.NoSuchMethodException: com.atguigu.ioc.component.HappyComponent.()
所以对一个JavaBean来说,无参构造器和属性的getXxx()、setXxx()方法是必须存在的,特别是在框架中。
8、用IOC容器创建对象和自己建区别
在Spring环境下能够享受到的所有福利,都必须通过 IOC 容器附加到组件类上,所以随着我们在 Spring 中学习的功能越来越多,IOC 容器创建的组件类的对象就会比自己 new 的对象强大的越来越多。
实验二 [重要]获取bean
1、方式一:根据id获取
由于 id 属性指定了 bean 的唯一标识,所以根据 bean 标签的 id 属性可以精确获取到一个组件对象。上个实验中我们使用的就是这种方式。
2、方式二:根据类型获取
①指定类型的 bean 唯一
@Test
public void testExperiment02() {
HappyComponent component = iocContainer.getBean(HappyComponent.class);
component.doWork();
}
②指令类型的 bean 不唯一
相同类型的 bean 在IOC容器中一共配置了两个:
根据类型获取时会抛出异常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.atguigu.ioc.component.HappyComponent' available: expected single matching bean but found 2: happyComponent,happyComponent2
③思考
如果组件类实现了接口,根据接口类型可以获取 bean 吗?
可以,前提是bean唯一
如果一个接口有多个实现类,这些实现类都配置了 bean,根据接口类型可以获取 bean 吗?
不行,因为bean不唯一
④结论
根据类型来获取bean时,在满足bean唯一性的前提下,其实只是看:『对象 instanceof 指定的类型』的返回结果,只要返回的是true就可以认定为和类型匹配,能够获取到。