目录
在上篇博客中我们使用Spring存储和获取Bean,因此Bean是Spring中最重要的资源,今天这篇博客就深入了解Bean对象
Bean作用域的例子
在上面的代码片段中我们可以看到并没修改dog对象却对后面注入对象造成了影响,这是什么原因呢,
原因就是Bean默认是单例的,也就是所有人的使用的都是同一个Bean对象
作用域定义
我们在之前的学习中认为作用域就是变量在程序中的可用范围,而在Bean作用域则是指Bean对象在整个Spring中的某种行为模式,比如单例模式表示在Spring(框架)中只有一份,默认是单例模式
Bean的六种作用域
1.singleton:单例作用域(默认作用域) 只有一个全局对象
2.prototype:原型作用域(多例) 每次访问创建新对象
3.request:请求作用域(适用MVC) 每次HTTP请求创建一个对象
4.session:会话作用域 (适用MVC) 每次会话使用一个Bean对象
5.application:全局作用域(适用MVC) 一个http servlet context中共享一个对象
6.websocket:HTTP WebSocket作用域(适用WebSocket中)
设置作用域
我们可以使用@Scope标签声明Bean作用域,设置Bean的作用域,注解使用方式有两种
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)//使用枚举设置
@Scope("prototype")//直接设置
可以看到我们添加了这一个注解就可以解决上诉问题了
Spring的执行过程和Bean的生命周期
Spring的主要执行流程
1.启动容器
2.Bean初始化
配置文件中的Bean,配置了加载组件路径下的类进行扫描(看是否添加类注解)
3.将Bean对象注入到Spring中
4.使用Bean
Bean的生命周期
一个对象从诞生到销毁的过程我们称为一个对象的生命周期
Bean的生命周期分为五个部分
1)实例化Bean(分配内存空间)
2)设置属性(依赖注入 DI)
3)Bean初始化
①执行各种通知
②初始化的前置方法(xml中定义 init-method 或者 @postConstruct)
③初始化方法
④初始化的后置方法
4)使用Bean
5)销毁Bean (xml destroy-method 或者 @PreDestroy)
注意事项
先设置属性在初始化的原因是初始化过程中有很多的方法,方法有可能调用属性中某个对象的方法,如果先初始化在实例化的话就会造成空指针异常