Bean对象的作用域与生命周期

97 阅读2分钟

Bean 作用域

Bean的作用域指的是 Bean 在 Spring 整个框架中的某种行为模式。比如:单例模式 singleton,就表示该对象在 Spring IOC 容器中只有一份,当一个人修改了这个对象时,另一个人读取的就是被修改后的内容

  1. singleton:单例作用域,只有一份【一般不需要修改的对象都被设置成这个】
  2. prototype:多例作用域,多份【类似于 string,当你修改多例模式的对象时,修改前和修改后属于两个对象】
  3. request:请求作用域【每次请求都会新建一个 Bean 对象,一次请求 Bean 对象共享】
  4. session:会话作用域【每次登录都会创建一个 Bean 对象,一次会话 Bean 对象共享】
  5. application:全局作用域【每次ApplicationContext对象中的Bean共享,重新获取context对象,则里面的 Bean 对象是新的一份】
  6. websocket:【只能在 websocket 程序中使用】

Spring 执行流程

  1. 启动容器【main方法开始】
  2. 加载 xx.xml配置文件:ClassPathXmlApplicationContext里面指定的
  3. Bean 初始化【配置文件中、指定了扫描路径下的加了注解的】
  4. 将 Bean 对象放到容器里面
  5. 使用 Bean
  6. 销毁容器

Bean 生命周期

里面那么多方法的作用:在初始化方法执行前可以做一些事,执行完后可以做一些事;比如:程序加载特别慢的时候,就可以通过构造方法 + bean 的销毁方法来算某个对象的加载时间,以此来进行优化代码

  1. 实例化(≠初始化)【分配内存空间】
  2. 设置属性【依赖注入 DI】 ---> 获得了实例化时的空间地址了
  3. 初始化
    1. 构造方法的执行
    2. 执行各种通知方法 如:BeanNameAware等接口的方法
    3. 初始化前置方法(xml init-method | @PostConstruct) 注解的优先级高于xml
    4. 初始化:afterPropertiesSet【@Bean注解的value属性指定bean对象时,在这里负责找的】
    5. 初始化后置方法
  4. 使用 Bean
  5. 销毁 Bean(xml destroy-method | @PreDestroy)

问题

这就是为什么 Spring 官方建议使用构造方法注入的原因

image.png

image.png