天天看点

Spring Bean 作用域常见的 4 种作用域注入 Session、Request 作用域的 Bean

常见的 4 种作用域

Spring Bean 的默认作用域是 Singleton。一般通过注解 @Scope 自定义Bean的作用域。

  • Singleton 整个应用中,只创建一个实例。(默认)

    ConfigurableBeanFactory.SCOPE_SINGLETON

  • Prototype 每次注入或通过Spring Application Context 获取时,都会创建一个新的实例

    ConfigurableBeanFactory.SCOPE_PROTOTYPE

  • Session 在 Web 应用中,为每个会话创建一个实例

    WebApplicationContext.SCOPE_SESSION

  • Request 在 Web 应用中,为每个请求创建一个实例

    WebApplicationContext.SCOPE_REQUEST

注入 Session、Request 作用域的 Bean

通常较少直接用到这类作用域的Bean。

一般会在 RestController 类中使用。

可以属性/字段注入的方式获取,也可以方法参数注入的方式获取。

Java代码

Spring Bean 作用域常见的 4 种作用域注入 Session、Request 作用域的 Bean
  1. @RestController  
  2. public class TestController {  
  3.   // 以字段注入的方式获取  
  4.   @Autowired  
  5.   private ServletRequest request;  
  6.   // 以方法参数注入的方式获取  
  7.   @GetMapping("/func")  
  8.   public void func(ServletRequest request) {  
  9.     ...  
  10.   }  
  11. }  

Spring Web 框架中的关键代码

spring-web 5.1.5.RELEASE

Java代码

Spring Bean 作用域常见的 4 种作用域注入 Session、Request 作用域的 Bean
  1. public abstract class WebApplicationContextUtils {  
  2.   public static void registerWebApplicationScopes(  
  3.       ConfigurableListableBeanFactory beanFactory,  
  4.       @Nullable ServletContext sc) {  
  5.     beanFactory.registerScope(  
  6.         WebApplicationContext.SCOPE_REQUEST, new RequestScope());  
  7.     beanFactory.registerScope(  
  8.         WebApplicationContext.SCOPE_SESSION, new SessionScope());  
  9.     if (sc != null) {  
  10.       ServletContextScope appScope = new ServletContextScope(sc);  
  11.       beanFactory.registerScope(  
  12.           WebApplicationContext.SCOPE_APPLICATION, appScope);  
  13.       // Register as ServletContext attribute, for ContextCleanupListener to detect it.  
  14.       sc.setAttribute(ServletContextScope.class.getName(), appScope);  
  15.     }  
  16.     beanFactory.registerResolvableDependency(  
  17.         ServletRequest.class, new RequestObjectFactory());  
  18.     beanFactory.registerResolvableDependency(  
  19.         ServletResponse.class, new ResponseObjectFactory());  
  20.     beanFactory.registerResolvableDependency(  
  21.         HttpSession.class, new SessionObjectFactory());  
  22.     beanFactory.registerResolvableDependency(  
  23.         WebRequest.class, new WebRequestObjectFactory());  
  24.     if (jsfPresent) {  
  25.       FacesDependencyRegistrar.registerFacesDependencies(beanFactory);  
  26.     }  
  27.   }  
  28. }