Bean 作用域
Bean的作用域指的是 Bean 在 Spring 整个框架中的某种行为模式。比如:单例模式 singleton,就表示该对象在 Spring IOC 容器中只有一份,当一个人修改了这个对象时,另一个人读取的就是被修改后的内容
- singleton:单例作用域,只有一份【一般不需要修改的对象都被设置成这个】
- prototype:多例作用域,多份【类似于 string,当你修改多例模式的对象时,修改前和修改后属于两个对象】
- request:请求作用域【每次请求都会新建一个 Bean 对象,一次请求 Bean 对象共享】
- session:会话作用域【每次登录都会创建一个 Bean 对象,一次会话 Bean 对象共享】
- application:全局作用域【每次ApplicationContext对象中的Bean共享,重新获取context对象,则里面的 Bean 对象是新的一份】
- websocket:【只能在 websocket 程序中使用】
Spring 执行流程
- 启动容器【main方法开始】
- 加载 xx.xml配置文件:ClassPathXmlApplicationContext里面指定的
- Bean 初始化【配置文件中、指定了扫描路径下的加了注解的】
- 将 Bean 对象放到容器里面
- 使用 Bean
- 销毁容器
Bean 生命周期
里面那么多方法的作用:在初始化方法执行前可以做一些事,执行完后可以做一些事;比如:程序加载特别慢的时候,就可以通过构造方法 + bean 的销毁方法来算某个对象的加载时间,以此来进行优化代码
- 实例化(
≠初始化)【分配内存空间】 - 设置属性【依赖注入 DI】 ---> 获得了实例化时的空间地址了
- 初始化
- 构造方法的执行
- 执行各种通知方法 如:BeanNameAware等接口的方法
- 初始化前置方法(xml init-method | @PostConstruct) 注解的优先级高于xml
- 初始化:afterPropertiesSet【@Bean注解的value属性指定bean对象时,在这里负责找的】
- 初始化后置方法
- 使用 Bean
- 销毁 Bean(xml destroy-method | @PreDestroy)
问题
这就是为什么 Spring 官方建议使用构造方法注入的原因