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)回收了

posted on 2020-11-11 17:35  凸凸大军的一员  阅读(138)  评论(0编辑  收藏  举报