• Bean作用域和生命周期


    一、Bean作用域定义

    限定程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域。
    Bean的作用域是指Bean在 Spring 整个框架中的某种行为模式,比效 singleton单例作用域,就表示Bean 在整个Spring 中只有一份,它是全局共享的,那么当其他人修改了这个值之后,另一个人读取到的就是被修改的值。

    1.1 Bean的作用域类型

    Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。Spring有6种作用域,最后四种是基于Spring MVC生效的:

    1. singleton:单例作用域(默认)
    2. prototype:原型作用域(多例作用域)
    3. request:请求作用域(Spring MVC)
    4. session:会话作用域(Spring MVC)
    5. application:全局作用域(Spring MVC)
    6. websocket: HTTP WebSocket 作用域(Spring WebSocket)

    单例作用域和全局作用域的区别
    singletonSpring Core的作用域;applicationSpring Web中的作用域; singleton 作用于loC的容器,而application 作用于Servlet容器。

    1.2 Bean执行流程(Spring执行流程)

    启动Spring容器->实例化Bean(分配内存空间,从无到有)->Bean注册到 Spring 中(存操作)->将Bean 装配到需要的类中(取操作)。

    二、Bean生命周期

    所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。

    Bean的生命周期分为以下5大部分:

    1. 实例化Bean(为Bean分配内存空间)
    2. 设置属性(Bean 注入和装配)
    3. Bean初始化
      a) 执行各种通知(执行各种 Aware) ;如 BeanNameAwareBeanFactoryAware
      ApplicationContextAware 的接口方法。
      b) 执行初始化的前置方法;
      c) 执行构造方法,两种执行方式,一种是执行@PostConstruct,另一种实质性 init-method
      d) 执行初始化的后置方法;
    4. 使用Bean
    5. 销毁Bean
      销毁容器的各种方法:
      a) @PreDestroy
      b) 重写DisposableBean接口方法
      c) destroy-method
    import org.springframework.beans.factory.BeanNameAware;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    //@Component
    public class BeanLifeComponent implements BeanNameAware {
    
        @PostConstruct
        public void postConstruct() {
            System.out.println("执行 @PostConstruct");
        }
    
        public void init() {
            System.out.println("执行 init-method");
        }
    
        public void use() {
            System.out.println("使用 bean");
        }
    
    
        @PreDestroy
        public void preDestroy() {
            System.out.println("执行了 @PreDestroy");
        }
    
        public void setBeanName(String s) {
            System.out.println("执行了 Aware 通知");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    调用类:

    public class App3 {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context =
                    new ClassPathXmlApplicationContext("spring-config.xml");
           BeanLifeComponent beanLifeComponent = context.getBean("beanLifeComponent", BeanLifeComponent.class);
           beanLifeComponent.use();
           context.destroy();      
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

  • 相关阅读:
    重装系统后新建文本文档打不开怎么办
    1.6-02:陶陶摘苹果
    kafka进阶核心原理详解:案例解析(第11天)
    linux重启mysql
    【JAVA项目实战】【图书管理系统】用户添加功能【Servlet】+【Jsp】+【Mysql】
    易观分析:制造行业数字孪生AMC分析 ——数字孪生智能制造步入市场启动期,闭环验证能力待优化
    各大AI模型训练成本大比拼
    SQL中的不加锁查询 with(nolock)
    常见的100道java面试题及答案【java学习+面试指南】(二)
    K8S 多集群管理很难?试试 Karmada | K8S Internals 系列第 3 期
  • 原文地址:https://blog.csdn.net/dddddrrrzz/article/details/125852507