写在前面
Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,并将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象。如果每次从Spring容器中获取对象时,都要创建一个新的实例对象,那么该如何处理呢?此时就需要使用【@Scope】注解来设置组件的作用域了。
1、@Scope注解概述
@Scope注解能够设置组件的作用域,我们先来看看@Scope注解类的源码,如下所示。
从@Scope注解类的源码中可以看出,在@Scope注解中可以设置如下值:
- ConfigurableBeanFactory#SCOPE_PROTOTYPE
- ConfigurableBeanFactory#SCOPE_SINGLETON
- org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
- org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
很显然,在@Scope注解中可以设置的值包括
【ConfigurableBeanFactory】接口中的【SCOPE_PROTOTYPE】和【SCOPE_SINGLETON】;
以及【WebApplicationContext】类中的【SCOPE_REQUEST】和【SCOPE_SESSION】。
是不是很头疼?别急,先来看看【ConfigurableBeanFactory】中写了啥。
1、在ConfigurableBeanFactory接口中有这两个值的常量。
String SCOPE_SINGLETON = “singleton”; --单例模式(默认值):全局有且仅有一个实例
String SCOPE_PROTOTYPE = “prototype”; --多例模式,每次获取Bean的时候都会生成新的实例
2、那【WebApplicationContext】类中这两个值是什么呢?
SCOPE_REQUEST:所对应的值就是 request
SCOPE_SESSION:所对应的值就是 session
【request】 和【session】作用域是需要Web环境来支持的,这两个值基本上使用不到。那这两个值的意义是什么呢?这里记录一下
request:表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session:作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
2、@Scope注解的使用
2.1单实例bean作用域
写法1(这种写法不理想)
a、新建一个配置类,然后实例化一个Person对象,并将其注入在Spring容器中,如下所示。
输出结果如下:
完整代码
MainConfig2.java
package com.leo