欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Bean的scope属性

程序员文章站 2022-05-23 23:13:25
...

Bean的scope属性

singleton单例(默认)

当scope的取值为singleton时 Bean的实例化个数:1个 Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例。

Bean的生命周期:

对象创建:当应用加载,创建容器时,对象就被创建了

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 

对象运行:只要容器在,对象一直活着。

对象销毁:当应用卸载,销毁容器时,对象就被销毁。

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="singleton">
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserDao userDao1 = (UserDao) app.getBean("userDao");

        UserDao userDao2 = (UserDao) app.getBean("userDao");

        System.out.println(userDao1);

        System.out.println(userDao2);

打印的userDao1、userDao2地址相同。

prototype多例

Bean的实例化个数:多个 Bean的实例化时机:当调用getBean()方法时实例化Bean。

对象创建:当使用对象时,创建新的对象实例

UserDao userDao1 = (UserDao) app.getBean(“userDao”);

对象运行:只要对象在使用中,就一直活着

对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="prototype">
    ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

    UserDao userDao1 = (UserDao) app.getBean("userDao");

    UserDao userDao2 = (UserDao) app.getBean("userDao");

    System.out.println(userDao1);

    System.out.println(userDao2);

打印的userDao1、userDao2地址不同。

request ,session和global session

这三个类型是spring2.0之后新增的,他们不像singleton和prototype那么通用,因为他们只适用于web程序,通常是和XmlWebApplicationContext共同使用

<bean id ="requestPrecessor" class="...RequestPrecessor"   scope="request" />

Spring容器,即XmlWebApplicationContext 会为每个HTTP请求创建一个全新的RequestPrecessor对象,当请求结束后,,该对象的生命周期即告结束。当同时有10个HTTP请求进来 的时候,容器会分别针对这10个请求创建10个全新的RequestPrecessor实例,且他们相互之间互不干扰,从不是很严格的意义上 说,request可以看做prototype的一种特例,除了场景更加具体之外,语意上差不多。

<bean id ="userPreferences" class="...UserPreferences"   scope="session" />

Spring容器会为每个独立的session创建属于自己的全新的UserPreferences实例,他比request scope的bean会存活更长的时间,其他的方面真是没什么区别。

<bean id ="userPreferences" class="...UserPreferences"   scope="globalsession" />

global session只有应用在基于porlet的web应用程序中才有意义,他映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待。

相关标签: Spring spring