JAVA-Spring Bean的生命周期

简介: JAVA-Spring Bean的生命周期

目录

基本概念

生命周期

Spring Bean的生命周期有哪些?

实例

目录结构

文件内容
MyBeanPostProcess文件

PersonBean文件

spring-config.xml文件

Test2文件

实例运行结果

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。
我们了解一个对象,作用域和生命周期是。上一篇我们聊到了Spring Bean的作用域,有兴趣的小伙伴可以去看看:JAVA-Spring Bean的作用域

基本概念

生命周期

百科中对自然界生命周期的解释:生命周期
JAVA中对象的生命周期:从对象的创建到销毁的过程。


Spring项目中,生命周期指的是一个bean对象从出生到死亡的整个过程。我们理解了Spring项目的生命周期的之后,可以利用 Bean 在其存活期间的指定时刻完成一些相关操作。


Spring Bean的生命周期过程有哪些?

实例

目录结构文件内容

MyBeanPostProcess文件

package com.tfjy.test2;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * @BelongsProject: demo
 * @BelongsPackage: com.tfjy.test2
 * @Author: aqiu
 * @Description: 自定义的后处理器
 * @CreateTime: 2023-01-29 20:54
 * @Version: 1.0
 */
public class MyBeanPostProcessor implements BeanPostProcessor {
    //前置处理器,bean对象初始化前的动作
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("5.BeanPostProcessor.postProcessBeforeInitialization方法:bean对象初始化之前的动作");
        return bean;
    }
    //后置处理器,创建bean对象结束后走这里
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("8.BeanPostProcessor#postProcessAfterInitialization方法:bean对象初始化之后的动作");
        return bean;
    }
}

PersonBean文件

package com.tfjy.test2;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
/**
 * @BelongsProject: demo
 * @BelongsPackage: com.tfjy.test2
 * @Author: aqiu
 * @Description: Bean的生命周期
 * @CreateTime: 2023-01-29 20:53
 * @Version: 1.0
 */
public class PersonBean implements InitializingBean, BeanFactoryAware, BeanNameAware, DisposableBean {
    /**
     * 身份证号
     */
    private Integer no;
    /**
     * 姓名
     */
    private String name;
    //最先走的方法就是调用构造函数,创建具体对象
    public PersonBean() {
        System.out.println("1.调用构造方法:我出生了!");
    }
    public Integer getNo() {
        return no;
    }
    public void setNo(Integer no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
        System.out.println("2.设置属性:我的名字叫" + name);
    }
    //BeanNameAware接口,通过这个接口设置bean的id
    @Override
    public void setBeanName(String s) {
        System.out.println("3.调用BeanNameAware#setBeanName方法:我的bean的名字叫做" + s);
    }
    //    BeanFactoryAware 用于注入BeanFactory对象,能访问创建对象的BeanFactory。
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("4.调用BeanFactoryAware#setBeanFactory方法:注入BeanFactory对象");
    }
    //    InitializingBean 接口
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("6.InitializingBean#afterPropertiesSet方法:开始初始化");
    }
    //在创建bean的时候,会走这个对应的初始化方法
    public void init() {
        System.out.println("7.自定义init方法:自定义初始化");
    }
    //销毁一个bean对象
    @Override
    public void destroy() throws Exception {
        System.out.println("9.DisposableBean#destroy方法:开始销毁");
    }
    public void destroyMethod() {
        System.out.println("10.自定义destroy方法:自定义销毁");
    }
    public void work() {
        System.out.println("Bean使用中~~~~");
    }
}

spring-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="myBeanPostProcessor" class="com.tfjy.test2.MyBeanPostProcessor" />
    <bean name="personBean" class="com.tfjy.test2.PersonBean"
          init-method="init" destroy-method="destroyMethod">
        <property name="no" value= "666666"/>
        <property name="name" value="妞妞" />
    </bean>
</beans>

Test2文件

import com.tfjy.test2.PersonBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @BelongsProject: demo
 * @Author: aqiu
 * @Description: Bean的生命周期测试类
 * @CreateTime: 2023-01-29 20:55
 * @Version: 1.0
 */
public class Test2 {
    @Test
    public void  test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        PersonBean personBean = (PersonBean) context.getBean("personBean");
        //开始使用
        personBean.work();
        //开始销毁
        ((ClassPathXmlApplicationContext) context).close();
    }
}

实例运行结果

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

相关文章
|
2月前
|
XML 安全 Java
|
1天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
32 21
|
2月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
2月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
70 6
|
2月前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
127 3
|
3月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
111 4
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
2月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
46 1
|
3月前
|
Java API 调度
Java 线程的生命周期
在JDK 1.5之前,线程的生命周期包括五种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。JDK 1.5及之后增加了三种阻塞状态,共六种状态:新建、可运行、终止、锁阻塞、计时等待和无限等待。这些状态描述了线程在操作系统和JVM中的不同阶段。
106 4
Java 线程的生命周期
|
4月前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
53 1
[Java]线程生命周期与线程通信