Bean作用域
作用域:限定程序中变量的可⽤范围叫做作⽤域,或者说在源代码中定义变量的某个区域就叫做作⽤域。
Bean作用域:Bean在整个Spring框架(项目)中的某种行为模式。
lombok使用教程(简化get和set方法):
①在项目中引用lombok
②在idea中安装lombok插件
③使用lombok注解(上图右侧的@)
Bean的六种作用域
Spring容易在初始化一个Bean的实例时,同时会指定该实例的作用域。
2.1 singleton:单例作用域(默认作用域)
效果:该作用域下的Bean在IoC容器中只存在一个实例:获取Bean及装配Bean都是同一对象。
适用场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新。
2.2 prototype:原型作用域(多例作用域)
效果:每次对该作用域下的Bean的请求都会创建新的实例:获取Bean及装配Bean都是新的对象实例。
适用场景:通常有状态的Bean使用该作用域。
2.3 request:请求作用域(限定SpringMVC中使用)
效果:每次http请求都会创建新的Bean实例,类似于prototype。
使用场景:一次http的请求和响应的共享Bean。
2.4 session:会话作用域(限定SpringMVC中使用)
效果:在一个http session中,定义一个Bean实例。
使用场景:用户会话的共享Bean。例如记录一个用户的登录信息。
2.5 application:全局作用域(限定SpringMVC中使用)
效果:在一个http servlet Context中,定义一个Bean实例。
使用场景:Web应用的上下文信息。例如记录一个应用的共享信息。
2.6 websocket:HTTP WebSocket 作用域(限定SpringMVC中使用)
效果:在一个HTTP WebSocket的生命周期中,定义一个Bean实例。
使用场景:WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一次初始化后,直接带WebSocket结束都是同一个Bean。
2.7 单例作用域(singleton)VS全局作用域(application)
singleton 是 Spring Core 的作⽤域;application 是 Spring Web 中的作⽤域;
singleton作用于IoC的容器;而application作用于Servlet容器。
设置作用域
使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,⽐如设置 Bean 的作⽤域。
@Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式:
①直接设置值:@Scope("prototype")
②使⽤全局变量设置:@Scope(ConfigurableBean Factory.SCOPE_PROTOTYPE)
Spring执行流程
启动流程(启动项目)
读取配置文件,初始化:使用配置文件直接注册Bean;配置Bean根(扫描)路径
将Bean存储到Spring中,通过类注解进行扫描和装配
将Bean从Spring读取出来,装配到相应的类
Bean生命周期
实例化Bean(类似于JVM加载:加载→连接→初始化),为Bean分配存储空间
设置属性(Bean注入和装配)
初始化:
①各种通知,实现了各种Aware通知的方法;
②初始化的前置工作,执行BeanPostProcessor初始化前置方法;
③进行初始化工作,使用注解@PostConstruct初始化或者使用(xml)init-method初始化;
④初始化的后置工作,执行BeanPostProcessor初始化后置方法。
使用Bean
销毁Bean(销毁容器的各种方法,如@PreDestroy、DisposableBean接口方法、destroy-method)
生命周期演示
1.注解:
2.xml配置文件:
3.调用类及执行结果(由于使用两种方法,故出现两个结果):
一种方法结果演示,与上述生命周期吻合: