• Spring 从入门到精通 (八) 简单对象创建控制和对象生命周期详解


    关键词:Spring | 简单对象 | 生命周期

    本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨

    在这里插入图片描述

    一、控制简单对象创建次数

    如何控制简单对象创建一次还是多次?可以通过Spring配置文件进行配置

    User实体类

    public class User {
        private String name;
        private int age;
    
        public User(String name) {
            this.name = name;
        }
    
        public User(int age) {
            this.age= age;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age='" + age+ '\'' +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在配置文件中使用 scope 属性,这个属性默认值为 singleton ,意思就是单例模式创建对象,假如想要多个实例,可以修改属性值为 prototype

    spring.xml 配置文件

    
    <bean id="user" class="entity.User">
        
        <constructor-arg type="int" value="123123"/>
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    test 测试类

    @Test
    public void t6() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring.xml");
        User user = context.getBean("user", User.class);
        User user1 = context.getBean("user", User.class);
        System.out.println(user == user1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    true
    
    • 1

    当配置属性值为 prototype 时,再次测试就不相等了,即Spring工厂为我们创建了两个全新的对象。
    spring.xml 配置文件

    
    <bean id="user" class="entity.User" scope="prototype">
        
        <constructor-arg type="int" value="123123"/>
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    test 测试类

    @Test
    public void t6() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring.xml");
        User user = context.getBean("user", User.class);
        User user1 = context.getBean("user", User.class);
        System.out.println(user == user1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    false
    
    • 1

    二、为什么要控制对象创建次数?

    如果对象可以被公用,创建一次就够了,如果对象不能被公用,就需要每一次创建新的,因此控制对象创建次数 避免了不必要的内存浪费

    三、对象生命周期

    之前对象的创建由我们手动 new ,现在对象创建的控制权交给了 Spring框架,由 Spring框架负责对象的创建,使用,销毁,了解对象生命周期,可以帮助我们更好的使用 Spring 为我们创建的对象。

    3.1、什么是对象生命周期?

    对象生命周期指的是对象创建,存活,销毁的整个过程

    3.2、对象生命周期的三个阶段

    1.创建阶段

    如果 scopesingleton 单例时,Spring 会在工厂创建时,完成对象的创建

    如果 scopeprototype 多例时,Spring 会在获取对象时,完成对象的创建

    注意: 如果我们想让单例对象也和多例对象一样,在获取的时候被创建,配置 lazy-init="true" 即可

    <bean id="user" class="entity.User" scope="singleton" lazy-init="true">
    
    • 1

    2.初始化阶段

    Spring工厂在创建对象后,调用对象的初始化方法,完成对象的初始化操作

    初始化方法,是由写代码的根据需要提供的,初始化方法是由工厂调用的。

    1.实现接口方法完成初始化

    User bean 对象

    public class User implements InitializingBean {
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.printf("User对象初始化了。。。");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    spring 配置文件

    <bean id="user" class="entity.User"/>
    
    • 1

    test 测试类

    @Test
    public void t2() {
        new ClassPathXmlApplicationContext("/spring.xml");
    }
    
    • 1
    • 2
    • 3
    • 4

    结果,工厂调用了初始化方法

    User对象初始化了。。。
    
    • 1

    2.对象中提供一个普通的方法

    User bean 对象,提供一个初始化方法

    public class User {
        public void userInit(){
            System.out.print("Init...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    spring 配置文件中通过 init-method="xxx" 指定一下这个方法,让工厂知道并可以调用它

    
    <bean id="user" class="entity.User" init-method="userInit"/>
    
    • 1
    • 2

    test 测试类

    @Test
    public void t2() {
        new ClassPathXmlApplicationContext("/spring.xml");
    }
    
    • 1
    • 2
    • 3
    • 4

    工厂成功发现并调用,完成初始化

    Init...
    
    • 1

    细节

    1.注入发生在初始化前

    2.同时实现接口和配置两种方法,同时进行初始化,两者都会执行,并且实现接口的方法会先执行,配置会后执行

    3.销毁阶段

    Spring销毁对象前,会调用相应的销毁方法,完成资源释放

    工厂关闭会进入销毁阶段,销毁主要完成资源释放,比如关闭流,关闭资源链接等等……,这个销毁方法是程序员根据具体需求写的,调用是由工厂调用的。

    两种方案,和前面的初始化类似

    1.实现 DisposableBean 接口

    2.定义普通方法,通过配置文件的 destroy-method="xxx" 配置告诉工厂

    注意:

    销毁方法只适用于单例对象,即scope="singleton"

    四、写在最后

    座右铭:不要在乎别人如何看你,要在乎你自己如何看未来,看梦想,看世界…!

    一起学习的可以私信博主或添加博主微信哦。

    专栏:订阅专栏 ✅
    关注:关注博主 🆙

  • 相关阅读:
    【netty】什么是netty
    电商前台项目(一):项目前的初始化及搭建
    Webpack5构建性能优化:构建耗时从150s到60s再到10s
    SSM整合(一)
    《缺氧》笔记整理
    仅用5000行代码,在V853上AI渲染出一亿幅山水画
    大学生数学建模赛题解析及优秀论文-2021电工杯A题高铁牵引供电系统运行数据分析及等值建模(附Python代码)
    深度学习中的样本分类:如何区分正样本、负样本、困难样本和简单样本?
    目标检测YOLO系列算法的进化史
    高考杂志高考杂志社高考编辑部2024年第14期目录
  • 原文地址:https://blog.csdn.net/m0_53321320/article/details/125871777