萤火小屋

优律的知识库

  • 首页
  • 归档
  • 分类
  • 标签
  • 留言
  • 关于

  • 搜索
消息队列 RabbitMQ Redis 双指针 力扣 动态代理 Git YAML SpringBoot SpringMVC 回溯算法 分治算法 归并排序 快排 手撕 事务 MySQL索引 MySQL 小技巧 Spring Framework Spring 动态规划 Linux Android 贪心算法 操作系统 进程调度模拟 IPv6 数据库 计算机组成原理 计算机基础 栈 Java 静态路由 路由器 交换机 数字通信 网络工程 计算机网络 Web http 大学学习技巧 程序设计 算法

Spring学习笔记-Bean的生命周期

发表于 2022-07-07 | 分类于 Spring | 0 | 阅读次数 51

1 Bean的初始化和销毁方法

Bean的生命周期分为创建、属性设置、初始化和销毁。在每个步骤我们可以定义自己的方法来执行一些代码逻辑。

1.1 Bean实例化时的方法

类构造器

1.2 Bean属性设置后调用的方法

实现org.springframework.beans.factory.InitializingBean接口中的afterPropertiesSet方法,在bean属性设置结束后会执行本方法。

1.3 bean初始化方法

1.3.1 BeanPostProcessor接口

  1. 实现BeanPostProcessor接口中的postProcessBeforeInitialization方法,本方法将会在bean初始化前调用。
  2. 实现BeanPostProcessor接口中的postProcessAfterInitialization方法,本方法将会在bean初始化结束后调用。

1.3.2 @PostConstruct注解

在bean中被@PostConstruct注解标注的方法将会在初始化前被调用,但是它会在postProcessBeforeInitialization方法后被调用。

1.3.3 自定义在bean中的初始化方法

在bean中自行定义一个初始化时执行的方法,在bean配置类的@Bean注解中给initMethod属性赋值为自定义方法的名字即可。

1.4 Bean的销毁方法

1.4.1 @PreDestroy方法

在bean中被@PreDestroy注解标注的方法将会在销毁前调用。

1.4.2 DisposableBean接口

实现org.springframework.beans.factory.DisposableBean接口中的destroy方法

1.4.3 自定义在bean中的销毁方法

在bean中自行定义一个销毁时执行的方法,在bean配置类的@Bean注解中给destroyMethod属性赋值为自定义方法的名字即可。

2 自定义初始化和销毁方法的执行步骤

创建和初始化

  1. 执行构造器
  2. 执行postProcessBeforeInitialization方法
  3. 执行在bean中被@PostConstruct注解的方法
  4. 执行afterPropertiesSet方法
  5. 执行自定义在bean中的初始化方法
  6. 执行postProcessAfterInitialization方法

销毁

  1. 执行在bean中被@PreDestroy注解的方法
  2. 执行destroy方法
  3. 执行自定义在bean中的销毁方法

代码演示

创建一个bean叫User,并实现InitializingBean和DisposableBean接口并重写其中的方法,编写无参构造器,编写被@PostConstruct和@PreDestroy注解的方法,编写自定义的初始化和销毁方法。

package cc.fireflyhut.selftech.bean;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class User implements InitializingBean, DisposableBean {

    private String username;

    public User() {
        System.out.println("执行构造器...");
    }

    /**
     * 自定义初始化时执行的方法
     */
    public void init() {
        System.out.println("执行自定义的init方法...");
    }

    /**
     * 自定义销毁时执行的方法
     */
    public void myDestroy() {
        System.out.println("执行自定义的myDestroy方法...");
    }

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

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

    @PostConstruct
    public void postConstruct() {
        System.out.println("执行postConstruct方法...");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("执行preDestroy方法...");
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

创建一个Process类实现BeanPostProcessor接口并重写其中的方法

package cc.fireflyhut.selftech.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + "执行postProcessBeforeInitialization方法...");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + "执行postProcessAfterInitialization方法...");
        return bean;
    }
}

创建一个Config类来生成User对象

package cc.fireflyhut.selftech.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean(initMethod = "init", destroyMethod = "myDestroy")
    public User user() {
        return new User();
    }

}

编写测试类执行bean初始化和销毁过程

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestBean {
    
    @Test
    public void testtest() {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext("cc.fireflyhut.selftech.bean");

        User user = applicationContext.getBean(User.class);
        System.out.println();
        applicationContext.close();
    }
    
}

如图红框中就是名为user的Bean从创建到销毁的过程。
image.png

# Java # Spring # Spring Framework
Spring注解学习[email protected]注解
Redis常用指令
  • 文章目录
  • 站点概览
优律

优律

优律的知识库

77 日志
20 分类
44 标签
E-mail Twitter Instagram
Links
  • CZLisyx - 浮生志
  • Vedfolnir
0%
© 2019 — 2023 萤火小屋——优律的博客网站
网站已勉强运行 
Halo博客系统技术支持