Spring bean 的作用域包含
- singleton
- prototype
web 应用中再加上
- request
- session
- application
- websocket
基于上一篇的应用进行改造,加入 bean,设置作用域。
spring xml 加入 prototype 的 User
<bean id="user2" class="constxiong.User" scope="prototype"/>
在 Controller 中加入各种作用域 bean 的请求
package constxiong.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.WebApplicationContext;
import constxiong.User;
/**
* controller
*
* @author ConstXiong
*/
@Controller
public class IndexController {
@Autowired
private ApplicationContext context;
@RequestMapping("singleton")
@ResponseBody
public String singlton() {
User user1 = context.getBean("user1", User.class);
return user1.toString();
}
@RequestMapping("prototype")
@ResponseBody
public String prototype() {
User user2 = context.getBean("user2", User.class);
return user2.toString();
}
@RequestMapping("request")
@ResponseBody
public String request() {
User user3 = context.getBean("user3", User.class);
return user3.toString();
}
@RequestMapping("session")
@ResponseBody
public String session() {
User user4 = context.getBean("user4", User.class);
return user4.toString();
}
@RequestMapping("application")
@ResponseBody
public String application() {
User user5 = context.getBean("user5", User.class);
return user5.toString();
}
@Bean
@Scope(WebApplicationContext.SCOPE_REQUEST)
private static User user3() {
return new User();
}
@Bean
@Scope(WebApplicationContext.SCOPE_SESSION)
private static User user4() {
return new User();
}
@Bean
@Scope(WebApplicationContext.SCOPE_APPLICATION)
private static User user5() {
return new User();
}
}
通过请求
- http://localhost:8080/singleton,每次请求 User 都是同一个对象
- http://localhost:8080/prototype,每次请求 User 都是不同的对象
- http://localhost:8080/request,每次请求 User 都是不同的对象
- http://localhost:8080/session,每一次会话周期内的请求 User 都是相同的对象,不同会话内间的 User 对象不同
- http://localhost:8080/application,每个 ServletContext 内,返回同一个对象
【Java学习资源】整理推荐
- 自定义 Bean 作用域
- Bean 的作用域
- maven 集成 tomcat 以 jar 的方式打包 web 应用
- Spring 依赖注入与依赖查找来源的区别
- Spring 依赖注入的处理过程与 DependencyDescriptor 的说明
- Spring 各种 Aware 接口回调注入
- Spring Bean 生命周期内的 Exception 复现
- Spring 内建 Bean
- Spring Bean 的别名
- Spring Bean 未指定名称的命名规则
- Bean 何时被 GC
- Spring Bean 延迟加载
- ObjectFactory 与 BeanFactory 的区别
- Bean 销毁的方式与顺序
- Bean 初始化的方式与顺序
- Bean 的实例化方式
- Bean的注册方式
- 什么是 BeanDefinition?
- Spring IoC 容器启动时做了什么?
- BeanFactory 与 FactoryBean 的区别
- BeanFactory 与 ApplicationContext 的区别
- Spring IoC 依赖注入的实现方式
- Spring IoC 依赖注入(支持哪些数据类型?)
- Spring bean 依赖查找
- Spring-IoC
- Spring 的核心特性
本文详细介绍了Spring框架中Bean的不同作用域,包括singleton、prototype、request、session和application等,并通过示例展示了如何配置和使用这些作用域。
649





