Bean作用域

  • 作用域:限定程序中变量的可⽤范围叫做作⽤域,或者说在源代码中定义变量的某个区域就叫做作⽤域。
  • Bean作用域:Bean在整个Spring框架(项目)中的某种行为模式。
  • lombok使用教程(简化get和set方法):

①在项目中引用lombok

Java bean通常用于在那些场景之间传递数据_作用域


Java bean通常用于在那些场景之间传递数据_初始化_02


Java bean通常用于在那些场景之间传递数据_java-ee_03

②在idea中安装lombok插件

Java bean通常用于在那些场景之间传递数据_作用域_04

③使用lombok注解(上图右侧的@)


Java bean通常用于在那些场景之间传递数据_java-ee_05


Java bean通常用于在那些场景之间传递数据_java_06


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")


Java bean通常用于在那些场景之间传递数据_java_07


②使⽤全局变量设置:@Scope(ConfigurableBean Factory.SCOPE_PROTOTYPE)


Java bean通常用于在那些场景之间传递数据_初始化_08


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.注解:


Java bean通常用于在那些场景之间传递数据_初始化_09


2.xml配置文件:


Java bean通常用于在那些场景之间传递数据_java-ee_10


3.调用类及执行结果(由于使用两种方法,故出现两个结果):


Java bean通常用于在那些场景之间传递数据_初始化_11


一种方法结果演示,与上述生命周期吻合:


Java bean通常用于在那些场景之间传递数据_作用域_12