scope:指对象的作用范围,取值如下

1.singleton:默认值,单例的
2.prototype:多例的

3.request:WEB项目,Spring创建一个Bean的对象,把对象存入到request域中
4.sessin:WEB项目,Spring创建一个Bean的对象,把对象存入到sessiont域中
5.global session:WEB项目中,应用在Portlet环境,如果没有Protlet环境那么globalSession相当于session

当前只了解singleton和prototype

===================================================
singleton如下
applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.hao.dao.impl.UserDaoImpl" scope="singleton"></bean> </beans>

测试类

public class SpringTest {

    @Test
//测试scope属性
public void test1(){
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1==userDao2);
}
}

结果:true
说明容器当中是单一对象


那UserDaoImpl什么时候被创建呢?那就来测试一下
1.重写空参构造方法

public class UserDaoImpl implements UserDao {

    public UserDaoImpl(){
System.out.println("UserDaoImpl被创建了");
}
@Override
public void save() {
System.out.println("save running...");
}
}

2.打断点,调试

我们发现在断点处,当加载配置文件,创建spring容器时,UserDaoImpl被创建了

================================================================================================

prototype测试如下
applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.hao.dao.impl.UserDaoImpl" scope="prototype"></bean> </beans>

1.重写UserDaoImpl空参构造方法(同上,省略代码)
2.断点调试

我们发现当加载配置文件,创建spring容器时,UserDaoImpl类对象没有被创建,继续走下一步

我们发现当调用getBean时,创建了UserDaoImpl对象,继续执行下一步

我们发现再此getBean时,另外一个UserDaoImpl对象也被创建了,而且我们发现两个对象的地址不一样
说明prototype是多实例对象,且在调用getBean方法时创建类对象

======================================================================================================
总结:
1)当scope属性取值为singleton时
Bean实例化个数:1个
Bean的实例化时机,当Spring核心配置文件被加载时,实例化配置的Bean实例(创建对象)
Bean的生命周期
*对象创建:当加载应用,创建容器时,对象就被创建了
*对象运行:只要容器在,对象一直活着
*对象销毁:当应用卸载,销毁容器时,对象被销毁
2)当scope属性取值为prototype时
Bean实例化个数:多个
Bean的实例化时机,当调用getBean()方法时,实例化Bean实例(创建对象)
Bean的生命周期
*对象创建:当使用对象时,创建新的对象实例
*对象运行:只要容器在,对象一直活着
*对象销毁:当对象长时间不用时,就被Java的垃圾回收器(GC)回收了

Spring-Bean标签属性scope范围的更多相关文章

  1. spring中的bean的属性scope

    spring中bean的scope属性,有如下5种类型: singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例 prototype表示每次获得be ...

  2. Spring中bean作用域属性scope

    关键字: spring中属性scope的prototype是什么意思   默认情况下,从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: Spri ...

  3. Spring Bean 标签解析

    上一篇文章讲到了标签在 parseDefaultElement 方法中进行解析,本篇文章将讲解这部分内容 bean 标签解析 查看 processBeanDefinition 方法,针对各个操作作具体 ...

  4. 1-3 Spring Bean 的属性值设置

    详见http://www.cnblogs.com/chenssy/archive/2013/03/17/2964593.html 1.注入普通的属性值 <bean id="Cat&qu ...

  5. Spring配置文件中<bean>标签的scope属性

    转自:https://fj-sh-chz.iteye.com/blog/1775149 singleton  (默认属性) Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引 ...

  6. spring bean标签常用属性

    一.id属性 其名称,可以是任意名称,但不能包含特殊符号. 根据id得到配置对象. 二.class属性 创建对象所在的类名称 三.name属性 功能和id属性一样,但name属性值可以包含特殊属性 四 ...

  7. 利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题

    问题的描述: 一个项目,涉及到了 两个数据源,分别使用的是 两个不同的 数据库连接池,其中一个是 poxool 连接池,问题在于,spring在启动时,只初始化其中的一个 数据库连接池中的数据库连接, ...

  8. spring bean parent属性详解

    必要条件:1.子bean必须与父bean保持兼容,也就是说子bean中必须有父bean定义的所有属性. 2.父bean必须是抽象bean或者定义lazy-init=true也就是不让bean工厂实例化 ...

  9. Spring<bean>标签是反射来实现的

随机推荐

  1. ArcMap操作随记(12)

    1.[取色器]工具 [自定义]|[自定义模式]|[命令] 2.批量修改符号 [符号系统]→右键,[所有符号的属性] 3.将地图元素转换为图形 转换工具 4.好看的地图边框 [布局视图]→数据框上右键→ ...

  2. 【elasticsearch】搜索过程详解

    elasticsearch 搜索过程详解 本文基于elasticsearch8.1.在es搜索中,经常会使用索引+星号,采用时间戳来进行搜索,比如aaaa-*在es中是怎么处理这类请求的呢?是对匹配的 ...

  3. 单链表上的一系列操作(基于c语言)

    单链表的实现分为两种单链表(其实差别并不是很大):带头结点和不带头结点,分别对应下面图中的上下两种. 链表的每一个结点是由两个域组成:数据域和指针域,分别存放所含数据和下一个结点的地址(这都是很明白的 ...

  4. MySQL存储引擎,索引及基本优化策略

    存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...

  5. AQS详解之独占锁模式

    AQS介绍 AbstractQueuedSynchronizer简称AQS,即队列同步器.它是JUC包下面的核心组件,它的主要使用方式是继承,子类通过继承AQS,并实现它的抽象方法来管理同步状态,它分 ...

  6. JVM基本概念

    JVM基础概念 什么是JVM JVM:Java virtual machine,Java虚拟机,它是一种规范.是虚构出来的一台计算机.它可以将二进制字节码根据不同的操作系统转为当前操作系统识别的的字节 ...

  7. Mycat 数据切分 看这一篇就够了

    数据切分 ​ 数据切分指的是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库上面,以达到分散单台设备负载的效果. ​ 数据的切分根据其切分规则的类型,可以分为两种切分模式.一种 ...

  8. 知识点简单总结——Lyndon分解

    知识点简单总结--Lyndon分解 Lyndon串 定义:一个字符串的最小后缀就是整个串本身. 等效理解:这个串为其所有循环表示中最小的. Lyndon分解 定义:将字符串分割为 $ s_{1} s_ ...

  9. Hibernate的session.load()和session.get()有什么分别?

    Get会发送查询语句提取数据,而load方法当对象使用时才去数据库查询.如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException.Lo ...

  10. Java 线程池中 submit() 和 execute()方法有什么区别?

    两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中. 而 submit()方法可以返回持有计算结果的 Future 对象,它定义在 Exe ...