Spring对象的生命周期

简介: Spring对象的生命周期

对象的生命周期

1.对象的生命周期的定义

对象的生命周期指的是一个对象的创建、存活、消亡的一个完整过程

2.为什么要学习对象的生命周期

以前我们写代码的时候,都是自己来new对象
User user=new User();
当对象被虚拟机的垃圾回收机制回收,它就销毁了
但是现在是由Spring来复杂对象的创建、存活、销毁,了解生命周期,有利于我们使用好Spring为我们创建的对象

3.生命周期的三个阶段

3.1创建阶段

  • 创建阶段

     Spring工厂什么时候创建对象呢?
    • 当 scope="singleton"

      • Spring工厂创建的同时,也会进行对象的创建
      • 接下来通过代码来测试
    • 我们先创建一个类来进行测试
public class Product {
    public Product() {
        System.out.println("Product无参构造执行");
    }
}

然后在配置文件进行配置

  <bean id="product" class="com.zyh.life.Product"></bean>

接下来进行测试
在这里插入图片描述

  • 如果这个时候,我们希望当scope="singleton"的时候,我们也是当获取对象的时候,才创建对象,要怎么做呢?
  • 我们只需要在配置文件中,增加一个属性lazy-init=true
<bean id="product" class="com.zyh.life.Product" scope="singleton" lazy-init="true"></bean>
  • 当scope="prototype"

     + 这个时候Spring工厂会在获取对象的时候,创建对象
       + ctx.getBean(" ");
       + 接下来进行测试
        ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/55e214257d2047e59d09d7f92732d2b6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmF2YeeahOWtpuS5oOS5i-i3rw==,size_20,color_FFFFFF,t_70,g_se,x_16)
    

3.2初始化阶段

  • Spring工厂在创建完对象以后,调用对象的初始化方法,完成对应的初始化操作
  • 初始化方法是由程序员提供的,提供初始化方法,来完成初始化操作

    • 初始化方法是由Spring工厂来调用的

      • 为了完成上述功能,我们应该让一个类实现InitializingBean接口,并且实现里面的方法afterPropertiesSet
public class Product implements InitializingBean {
    public Product() {
        System.out.println("Product无参构造执行");
    }

    /**
     * 这个就是初始化方法,做初始化的操作
     * 是由Spring来调用
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Spring调用afterPropertiesSet方法进行初始化操作");
    }
}

在这里插入图片描述

  • 我们还有第二种方法可以进行初始化操作

    • 对象中提供一个普通的方法
这个方法的方法名是随便取 的
public void myInit(){

}
这个方法是由Spring来调用的,但是Spring怎么知道这个方法的存在呢
这个时候,就需要我们在配置文件中进行配置
<bean id="product" class="xxx.Product" init-method="myInit"/>

接下来进行演示

package com.zyh.life;

import org.springframework.beans.factory.InitializingBean;

/**
 * @author zengyihong
 * @create 2022--04--17 13:27
 */
public class Product {
    public Product() {
        System.out.println("Product无参构造执行");
    }
    public void myInit(){
        System.out.println("自己写的初始化方法");
    }

  
}
<bean id="product" class="com.zyh.life.Product" init-method="myInit"  ></bean>

在这里插入图片描述
接下来我们进行细节上的分析

  • 如果一个对象既实现InitializingBean接口,同时又提供普通的初始化方法,那么它们的执行顺序是则怎样的

    • 先执行接口的初始化方法再执行我们写的普通初始化方法
  • 如果类有成员变量,我们想要进行注入,那么初始化和注入的执行顺序又是怎样的呢

    • Spring会先进行成员变量的注入然后才进行初始化
package com.zyh.life;

import org.springframework.beans.factory.InitializingBean;

/**
 * @author zengyihong
 * @create 2022--04--17 13:27
 */
public class Product  implements InitializingBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("Product注入操作");
        this.name = name;
    }

    public Product() {
        System.out.println("Product无参构造执行");
    }
    public void myInit(){
        System.out.println("自己写的初始化方法");
    }

    /**
     * 这个就是初始化方法,做初始化的操作
     * 是由Spring来调用
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Spring调用afterPropertiesSet方法进行初始化操作");
    }
}

在这里插入图片描述
在这里插入图片描述
那么什么是初始化操作呢
初始化操作指的是对资源的初始化:比如数据库 IO 网络

3.3销毁阶段

Spring销毁对象前,会调用对象的销毁方法

  • 那么Spring什么时候会销毁所创建的对象呢

    • Spring销毁对象,是在它的工厂关闭的时候 ctx.close();
    • 销毁方法:程序员根据自己的需求,定义销毁方法,完成销毁操作

      • 调用:Spring工厂完成调用

      那么如何定义销毁方法呢,和刚刚对象的初始化阶段类似,我们这里也有两种方法
      销毁操作我们可以理解成为资源的释放操作

      • ①实现DisposableBean接口,并且实现里面的destroy方法
public class Product  implements InitializingBean, DisposableBean{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("Product注入操作");
        this.name = name;
    }

    public Product() {
        System.out.println("Product无参构造执行");
    }
    public void myInit(){
        System.out.println("自己写的初始化方法");
    }

    /**
     * 这个就是初始化方法,做初始化的操作
     * 是由Spring来调用
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Spring调用afterPropertiesSet方法进行初始化操作");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("Spring销毁方法执行");
    }
}

在这里插入图片描述

  • ②定义一个普通的销毁方法,然后在配置文件中进行配置
 public void myDestroy()throws Exception{
        System.out.println("自己写的销毁方法");
    }

在配置文件配置,也就是加上destroy-method

<bean id="product" class="com.zyh.life.Product" init-method="myInit" destroy-method="myDestroy"  >
        <property name="name" value="tom"></property>
    </bean>

接下来还是进行细节方面的讨论
会先执行Spring的销毁方法,然后才执行我们自己定义的销毁方法
在这里插入图片描述
销毁方法的操作,只适用于scope="singleton",对于其他作用域没有作用

  • 销毁操作主要用来资源的释放
相关文章
|
2月前
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
30 2
|
4天前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
2月前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
38 0
|
22天前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
60 11
|
23天前
|
缓存 安全 Java
Spring高手之路21——深入剖析Spring AOP代理对象的创建
本文详细介绍了Spring AOP代理对象的创建过程,分为三个核心步骤:判断是否增强、匹配增强器和创建代理对象。通过源码分析和时序图展示,深入剖析了Spring AOP的工作原理,帮助读者全面理解Spring AOP代理对象的生成机制及其实现细节。
17 0
Spring高手之路21——深入剖析Spring AOP代理对象的创建
|
15天前
|
Java Spring
Spring的Bean生命周期中@PostConstruct注解
【8月更文挑战第3天】在Spring框架中,`@PostConstruct`注解标示Bean初始化完成后立即执行的方法。它在依赖注入完成后调用,适用于资源加载、属性设置等初始化操作。若方法中抛出异常,可能影响Bean初始化。与之对应,`@PreDestroy`注解的方法则在Bean销毁前执行,用于资源释放。
|
2月前
|
Java 开发者 Spring
Spring 中 Bean 的生命周期
Spring 中 Bean 的生命周期
20 2
|
2月前
|
存储 XML Java
在 Java 中,Spring 框架提供了一种更加简单的方式来读取和存储对象
【6月更文挑战第18天】Java Spring 框架利用注解简化对象管理:@Component(及衍生注解@Service等)标注Bean类,自动注册到容器;@Autowired用于字段或方法,实现依赖注入,提升灵活性,减少XML配置。
24 2
|
3月前
|
Java Spring 容器
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
46 1
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
|
1月前
|
Java 微服务 Spring
微服务04---服务远程调用,根据订单id查询订单功能,根据id查询订单的同时,把订单所属的用户信息一起返回,Spring提供了一个工具RestTemplate,Bean写在对象前面,以后可以在任何地
微服务04---服务远程调用,根据订单id查询订单功能,根据id查询订单的同时,把订单所属的用户信息一起返回,Spring提供了一个工具RestTemplate,Bean写在对象前面,以后可以在任何地