Bean 的六种作用域
- .
- Bean的作用域
- 属性注入和content获取Bean
- 单例作用域:http://127.0.0.1:8080/single1
- 多例作用域: http://127.0.0.1:8080/prototype
- 请求作用域: http://127.0.0.1:8080/request
- 会话作用域: http://127.0.0.1:8080/session
- Application作用域: http://127.0.0.1:8080/application
.
Bean的作用域
作用域 | 说明 |
---|---|
singleton | 单例作用域, 每个Spring IoC容器内同名称的bean只有⼀个实例(单例)(默认) |
prototype | 原型作用域,每次使用该bean时会创建新的实例(非单例) |
request | 请求作用域 ,每个HTTP 请求生命周期内, 创建新的实例(web环境中) |
session | 会话作用域 ,每个HTTP Session生命周期内, 创建新的实例(web环境中) |
application | 全局作用域,每个ServletContext生命周期内, 创建新的实例(web环境中) |
websocket | HTTP WebSocket 作用域 ,每个WebSocket生命周期内, 创建新的实例(web环境中) |
package com.example.demo.config;import com.example.demo.model.User;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.context.annotation.ApplicationScope;
import org.springframework.web.context.annotation.RequestScope;
import org.springframework.web.context.annotation.SessionScope;@Configuration
public class BeanConfig {@Bean@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public User single1(){return new User();}@Beanpublic User single2(){return new User();}@Bean@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public User prototype(){return new User();}@Bean@RequestScopepublic User request(){return new User();}@Bean@SessionScopepublic User session(){return new User();}@Bean@ApplicationScopepublic User application(){return new User();}
}
package com.example.demo.controller;import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate User single1;@Autowiredprivate User single2;@Autowiredprivate User prototype;@Autowiredprivate User request;@Autowiredprivate User session;@Autowiredprivate User application;@AutowiredApplicationContext applicationContext;@RequestMapping("/single1")public String single1(){User user = (User) applicationContext.getBean("single1");return user.toString()+single1.toString();}@RequestMapping("/single2")public String single2(){User user = (User) applicationContext.getBean("single2");return user.toString()+single2.toString();}@RequestMapping("/prototype")public String prototype(){User user = (User) applicationContext.getBean("prototype");return user.toString()+prototype.toString();}@RequestMapping("/request")public String request(){User user = (User) applicationContext.getBean("request");return user.toString()+request.toString();}@RequestMapping("/session")public String session(){User user = (User) applicationContext.getBean("session");return user.toString()+session.toString();}@RequestMapping("/application")public String application(){User user = (User) applicationContext.getBean("application");return user.toString()+application.toString();}
}
属性注入和content获取Bean
我们可以通过浏览器可以访问上述代码中的url,每个请求都至少请求两次
可以得到以下结论:
单例作用域:http://127.0.0.1:8080/single1
多次访问, 得到的都是同⼀个对象, 并且 @Autowired 和applicationContext.getBean() 也是同⼀个对象.
多例作用域: http://127.0.0.1:8080/prototype
applicationContext.getBean()每次获取的对象都不⼀样,属性注入的对象在Spring容器启动时, 就已经注入了, 所以多次请求也不会发生变化
请求作用域: http://127.0.0.1:8080/request
在每⼀次请求中, @Autowired 和 applicationContext.getBean() 都是同⼀个对象.
但是每次请求, 都会重新创建对象
会话作用域: http://127.0.0.1:8080/session
在⼀个session中, 多次请求, 获取到的对象都是同⼀个
换⼀个浏览器访问, 发现会重新创建对象.(另⼀个Session)
Application作用域: http://127.0.0.1:8080/application
在⼀个应用中, 多次访问都是同⼀个对象,即使是不同的浏览器