Spring_02_Bean基本配置

来源:互联网 发布:淘宝全新店铺购买 编辑:程序博客网 时间:2024/05/21 09:28

一、知识点概述

通过上一章的内容可知,在Spring的配置文件中进行Bean的配置,可以将一个对象实例交给Spring容器进行管理。

Spring容器对某个Bean的管理方案处决于Bean的配置。

  • Class属性:必须属性,用于指定Bean的完整类路径。

  • ID属性:Bean的唯一标识,在整个Spring容器中唯一,用于与任何其它Bean进行区分,可以通过标识精确获取到指定的Bean实例。

  • Name属性:跟ID属性一样,也属于标识,如果没有ID属性,则Name属性会被视为ID属性,如果有ID属性,则Name属性被视为Bean的别名。

二、项目构建

1、创建Maven项目

<groupId>ycz.spring</groupId><artifactId>02_spring_bean</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging>

2、添加对Spring的依赖

<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-core</artifactId>    <version>4.3.8.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context-support</artifactId>    <version>4.3.8.RELEASE</version></dependency>

三、测试用例

1、测试Class属性

  • 新增Bean类

在src/main/java源路径下新增包com.ycz.spring.ch1
在com.ycz.spring.ch1包下新增类Section1,内容如下

public class Section1 {}
  • 注册Bean

在Spring的配置文件中添加

<bean class="com.ycz.spring.ch1.Section1"/>
  • 编写测试方法
public class Boot {    public static void main(String[] args) {        // 读取配置文件config.xml,启动IOC容器        ApplicationContext ac = new ClassPathXmlApplicationContext("config.xml");        // 从IOC容器中获取Bean实例        Section1 bean1 = ac.getBean(Section1.class);        Section1 bean2 = ac.getBean(Section1.class);        // 多次获取对象实例,实际获取的是同一个对象        System.out.println(bean1 == bean2);  // true    }}
  • 运行结果
true
  • 代码分析

在Spring配置文件中的一个Bean配置,代表着向Spring容器注册一个对象实例,Class属性代表该实例的数据类型,可以通过Spring容器提供的getBean方法获取该实例。

<T> T getBean(Class<T> requiredType)
  • 通过结果可以看出

多次获取同一个Bean实例,Spring返回的都是同一个实例。

这是因为Spring默认使用 单例模式 创建对象实例,实例会在Spring容器启动时创建并初始化,实例初始化之后,会被Spring缓存起来,之后每一次获取实例时,Spring就会直接从缓存中将已创建好的实例直接返回,所以每一次获取的都是同一个实例。

  • 扩展

1> 在配置文件中可以再配置一个Section1吗?如下所示

<bean class="com.ycz.spring.ch1.Section1"/>

不能

使用Spring管理对象实例,最重要的是能够将实例正常取出来使用。

假设全世界只有一只猫叫Cat,那么当我们说”猫“的时候,当然指的就是Cat。
假设世界上再多了一只猫Tom,那我们再说“猫”的时候,就不知道说的是哪一只猫了。

猫是一种类型(class),而一只猫Cat,猫Tom就是一个实例(object)。

同理,我们通过Section1类来获取Section1实例,如果Spring容器中只有一个Section1实例,那么Spring可以将该实例返回。如果Spring容器中不止一个Section1实例,那么Spring就不知道该返回哪一个Section1实例。

所以,如果只配置Class属性,同一个类不能配置多个。


2、测试ID属性

  • 新增Bean类
    在src/main/java源路径下新增包com.ycz.spring.ch2
    在com.ycz.spring.ch2包下新增类Section2,内容如下
public class Section2 {}
  • 注册Bean,在Spring的配置文件中添加
<bean id="section2_01" class="com.ycz.spring.ch2.Section2"/><bean id="section2_02" class="com.ycz.spring.ch2.Section2"/>
  • 编写测试方法
public class Boot {    public static void main(String[] args) {        // 读取配置文件config.xml,启动IOC容器        ApplicationContext ac = new ClassPathXmlApplicationContext("config.xml");        // 从IOC容器中获取Bean实例        // 根据Bean的ID属性获取Bean        Section2 bean1 = (Section2) ac.getBean("section2_01");        // 根据Bean的ID及Class属性获取Bean        Section2 bean2 = ac.getBean("section2_01", Section2.class);        Section2 bean3 = ac.getBean("section2_02", Section2.class);        // 不同的方式获取同一个实例,获取出来是依然是同一个实例        System.out.println(bean1 == bean2);  // true        // 同一个类的两个实例,获取出来是两个不同的实例        System.out.println(bean2 == bean3);  // false    }}
  • 运行结果
truefalse
  • 代码分析

通过ID属性,可以为同一个Class类配置多个对象实例,每一个实例都有自己唯一的ID,可以通过ID属性获取相应的实例。

而通过ID属性获取实例的方法可以有两种

Object getBean(String name)<T> T getBean(String name, Class<T> requiredType)

第一种是只通过ID属性进行获取,得到的是一个Object类型,使用时需要进行强制类型转换。
第二种是通过ID属性及Class属性进行获取,得到的是参数中指定的Class类型对象,这是对泛型的应用。

  • 通过结果可以看出

对同一个ID使用不同的方法进行获取,得到的实例都是同一个。而对不同的ID进行获取,得到的实例也是不同的。

因为一个Bean配置代表一个实例,Class属性只是代表该实例的数据类型,ID属性代表该实例的标识。


3、测试Name属性

  • 新增Bean类
    在src/main/java源路径下新增包com.ycz.spring.ch3
    在com.ycz.spring.ch3包下新增类Section3,内容如下
public class Section3 {}
  • 注册Bean,在Spring的配置文件中添加
<bean name="section3_01" class="com.ycz.spring.ch3.Section3"/><bean name="section3_02_01,section3_02_02" class="com.ycz.spring.ch3.Section3"/>
  • 编写测试方法
public class Boot {    public static void main(String[] args) {        // 读取配置文件config.xml,启动IOC容器        ApplicationContext ac = new ClassPathXmlApplicationContext("config.xml");        // 从IOC容器中获取Bean实例        // 根据Bean的Name获取Bean        Section3 bean1 = (Section3) ac.getBean("section3_01");        Section3 bean2 = ac.getBean("section2_02_01", Section3.class);        Section3 bean3 = ac.getBean("section2_02_02", Section3.class);        // 不同的方式获取同一个实例,获取出来是依然是同一个实例        System.out.println(bean1 == bean2);  // false        // 同一个类的两个实例,获取出来是两个不同的实例        System.out.println(bean2 == bean3);  // true    }}
  • 运行结果
falsetrue
  • 代码分析

如果ID属性不存在,则Name属性被视为ID属性,所以一般情况下ID属性与Name属性选择一个使用即可。

ID属性只能设置一个值,但是Name属性可以设置多个值,多个值之间可以使用逗号分隔。第一个将被视为ID属性,而后面的则被视为别名。对别名的使用与对标识的使用是一样的,也是通过getBean方法进行获取。

  • 通过结果可以看出

对Name的使用与ID的使用是相同的,都是通过getBean方法进行实例的获取。
对别名的使用与ID的使用也是相同的,都是通过getBean方法进行实例的获取。
对同一个Bean对象的标识与别名分别进行实例获取,得到的是同一个实例。