网站建设维护公司资质,做ppt图片网站 知乎,建网站 必须学html吗,免费建立公司网站目录 什么是 Bean 的作用域 ?Bean 的六种作用域Spring 的执行流程Bean 的生命周期 什么是 Bean 的作用域 ?
Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式#xff0c;⽐如 singleton 单例作⽤域#xff0c;就表示 Bean 在整个 Spring 中只有⼀份#xff0c… 目录 什么是 Bean 的作用域 ?Bean 的六种作用域Spring 的执行流程Bean 的生命周期 什么是 Bean 的作用域 ?
Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式⽐如 singleton 单例作⽤域就表示 Bean 在整个 Spring 中只有⼀份它是全局共享的那么当其他⼈修改了这个值之后那么另⼀个⼈读取到的就是被修改的值。
它的概念与我们之前学的作用域不一样之前是指变量的可⽤范围叫做作⽤域。
Bean 的六种作用域 singleton单例作用域默认的作用域线程不安全 说明该作⽤域下的 Bean 在 IoC 容器中只存在⼀个实例获取 Bean 及装配 Bean 都是同⼀个对 象 场景通常⽆状态的 Bean 使⽤该作⽤域。⽆状态表示 Bean 对象的属性状态不需要更新 无状态的 bean只有普通的对数据的操作方法没有存储功能 prototype原型(多例)作用域 线程安全 说明每次对该作⽤域下的 Bean 的请求都会创建新的实例获取 Bean 及装配 Bean 都是新的对象 实例 场景通常有状态的Bean使⽤该作⽤域 request请求作用域 说明每次http请求会创建新的Bean实例类似于prototype 场景⼀次http的请求和响应的共享Bean 备注限定SpringMVC中使⽤ session会话作用域 说明在⼀个http session中定义⼀个Bean实例 场景⽤户回话的共享Bean, ⽐如记录⼀个⽤户的登陆信息 备注限定SpringMVC中使⽤ application应用作用域了解 说明在⼀个http servlet Context中定义⼀个Bean实例 场景Web应⽤的上下⽂信息⽐如记录⼀个应⽤的共享信息 备注限定SpringMVC中使⽤ websocket了解 说明在⼀个HTTP WebSocket的⽣命周期中定义⼀个Bean实例 场景WebSocket的每次会话中保存了⼀个Map结构的头信息将⽤来包裹客户端消息头。第⼀ 次初始化后直到WebSocket结束都是同⼀个Bean 备注限定Spring WebSocket中使⽤ 注意普通的 Spring 项⽬中只有前两种后 4 种状态是 Spring MVC 中的。 两种设置多例作用域方法 Scope(“prototype”) Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 检验默认作用域是否为单例作用域
User 类
public class User {private String name;private int id;public String getName() {return name;}public void setName(String name) {this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}
}Users 类存储公共对象
Service
public class Users {Beanpublic User getUser(){User user new User();user.setId(888);user.setName(张三);return user;}
}取对象的两大类
Controller
public class UserController1 {Autowiredprivate User user;public void doMethod() {System.out.println(修改前的名字: user.getName());user.setName(王五);System.out.println(修改后的名字: user.getName());}
}Controller
public class UserController2 {Autowiredprivate User user;public void doMethod() {System.out.println(UserController2 拿到的名字: user.getName());}
}启动类
public class App {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(spring-config.xml);UserController1 userController1 context.getBean(userController1,UserController1.class);userController1.doMethod();UserController2 userController2 context.getBean(userController2,UserController2.class);userController2.doMethod();}
}输出 可以看到张三这个名字被改后后续再取这个 Bean 就拿不到张三了。
设置多例作用域
Service
public class Users {Scope(prototype)Beanpublic User getUser(){User user new User();user.setId(888);user.setName(张三);return user;}
}这里拿到的每个 Bean 对象都是 new 了一个新的不是直接拿容器中原有的对象。
Spring 的执行流程 启动容器读取配置进行 Bean 的实例化分配内存空间从无到有将 Bean 加入到容器中存操作装配 Bean 属性取操作 Bean 的生命周期
⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程Bean 的生命周期分为下面五个部分 实例化内存空间分配设置 Bean 属性进行依赖注入将依赖的 Bean 赋值到当前类属性上Bean 的初始化 3.1 执行各种通知 3.2 初始化的前置方法 3.3 初始化方法 3.4 初始化的后置方法使用 Bean销毁 Bean 实例化和初始化的区别 实例化和属性设置是 Java 级别的系统“事件”其操作过程不可⼈⼯⼲预和修改⽽初始化是给开发者提供的可以在实例化之后类加载完成之前进⾏⾃定义“事件”处理