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对象的标识与别名分别进行实例获取,得到的是同一个实例。
- Spring_02_Bean基本配置
- 基本配置
- 配置基本
- 基本配置
- PHPStorm基本的配置配置
- 路由器基本配置漫谈
- JSP基本配配置
- VPN的基本配置
- VPN的基本配置
- 基本的配置
- Tomcat5.5基本配置
- Java基本环境配置
- Zebra基本配置
- drools3.0基本配置
- java的基本配置
- JAVA基本配置
- linux vsftpd 基本配置
- JDK的基本配置
- Q120:PBRT-V3,“直接光照”积分器(14.3章节)
- Intellij IDEA基于Springboot的远程调试
- Guava Table接口
- nginx问题知识汇总
- 怎么申请苹果iOS开发者账号?ios开发者账号申请流程介绍
- Spring_02_Bean基本配置
- python3 网络爬虫(四)如何查找以及使用cookies
- 详解java动态代理模式
- js日期计算
- 浏览器兼容问题
- 实时监控文本框中的数据变化(完美解决方案)
- DB2和Oracle的translate的不同之处
- ubuntu: apt-get update的时候遇到“Hash Sum mismatch”错误
- quartz----时间配置