10-Bean对象的作用域及生命周期
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 | 多例,每次使用时都是创建一个实例 |
request | web环境下,每一次独立请求存在唯一实例 |
session | web环境下,每一个session存在有唯一实例 |
application | web环境下,ServletContext存在唯一实例 |
websocket | 每一次WebSocket连接中存在唯一实例 |
singleton 单例(默认值)
singleton在容器是单例多线程执行,存在线程安全风险
解决方法如下:
- 在设置时加锁
- 不要设置成单例的,设置成prototype
prototype多实例
singleton单例与prototype多实例对比
singleton | prototype | |
---|---|---|
对象数量 | 全局唯一 | 存在多个 |
实例化时机 | 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
导航,上一页,下一页
支持我-微信扫一扫-加入微信公众号
赞赏作者
![赞赏作者](https://img.znyd365.com/torey/Aseven/zanShang2.jpg)