10-Bean对象的作用域及生命周期

10-Bean对象的作用域及生命周期

回到spring导航页

10-bean scope属性讲解

  • bean scope属性用于决定对象何时被创建与作用范围
  • bean scope配置将影响容器内对象的数量
  • bean scope默认值singleton(单例),指全局共享同一个对象实例
  • bean scope属于用于决定对象何时被创建与作用范围
  • bean scope配置将影响容器内对象的数量
  • 默认情况下bean会在IoC容器创建后自动实例化,全局唯一

scope用法

<bean id="c1" class="com.torey.spring.ioc.entity.Computer" scope="prototype"></bean>
scope属性说明
singleton单例(默认值),每一个容器有且只有唯一的实例,实例被全局共享
prototype多例,每次使用时都是创建一个实例
requestweb环境下,每一次独立请求存在唯一实例
sessionweb环境下,每一个session存在有唯一实例
applicationweb环境下,ServletContext存在唯一实例
websocket每一次WebSocket连接中存在唯一实例

singleton 单例(默认值)

singleton在容器是单例多线程执行,存在线程安全风险
默认单例
spring中singleton的线程安全问题
解决方法如下:

  1. 在设置时加锁
  2. 不要设置成单例的,设置成prototype

prototype多实例

spring中prototype多实例

singleton单例与prototype多实例对比

singletonprototype
对象数量全局唯一存在多个
实例化时机IoC容器启动时getBean()或对象注入时
线程安全问题存在不存在
执行效率

bean scope实际应用

package com.torey.spring.ioc.dao;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 7:19
 * @描述:
 */
public class UserDao {
    public UserDao() {
        System.out.println("UserDao已经打印:" + this.hashCode());
    }
}

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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao" class="com.torey.spring.ioc.dao.UserDao">
    </bean>
</beans>

测试一

package com.torey.spring.ioc;

import com.torey.spring.ioc.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 7:23
 * @描述:
 */
public class SpringApplication {
    public static void main(String[] args) {
        ApplicationContext context=
                new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    }
}

程序启动时,UserDao就会被创建,打印输出如下:

UserDao已经打印:644460953

添加两行代码:

    public static void main(String[] args) {
        ApplicationContext context=
                new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        UserDao bean = context.getBean("userDao", UserDao.class);
        UserDao bean2 = context.getBean("userDao", UserDao.class);
    }

这时候,也只有一行打印输出

如果在bean上添加scope=“prototype”

<bean id="userDao" class="com.torey.spring.ioc.dao.UserDao" scope="prototype">
    </bean>

则会输出两行如下:

UserDao已经打印:1047503754
UserDao已经打印:1225439493

导航,上一页,下一页

9注入集合对象

11bean的生命周期

支持我-微信扫一扫-加入微信公众号

Aseven公众号

赞赏作者

赞赏作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值