Bean的生命周期及演示

这篇具有很好参考价值的文章主要介绍了Bean的生命周期及演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、介绍

概念

Bean的生命周期是指一个Bean对象从创建到销毁的整个存在过程。


Bean生命周期组成:

1.实例化Bean(为Bean分配内存空间)
2.属性注入 (Bean注入和装配)
3.Bean的初始化

  • 各种通知:如 BeanNameWare、BeanFactoryAware、ApplicationContextAware 的接口方法。
  • 初始化前置方法
  • 执行初始化方法
    • 注解方式:@PostConstruct
    • xml 方式:init-method 方法
  • 初始化后置方法

4.使用Bean
5.销毁Bean

注:

通过 @PostConstruct 注解方式初始化,需要在配置文件设置扫描路径;
通过 xml 方式初始化,需要在配置文件用标签中的 init-method 属性配置对应类的初始化方法名。


二、实例演示

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"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com"></content:component-scan>
    <bean id="beanLifeComponent" 
    class="com.example.BeanLifeComponent" init-method="init"></bean>
</beans>

注:init-method 属性的值是 bean 对应的初始化方法的名称。如果该属性的值不匹配方法名,则在初始化 bean 时会抛出 NoSuchMethodException 异常。此处 ‘init’ 对应下面 xml 方式初始化方法名。

com.example.BeanLifeComponent.java

package com.example;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

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

public class BeanLifeComponent implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanPostProcessor {
    /**
     * 执行通知方法
     * @param s
     */
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了BeanNameAware:BeanName = " + s);
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("执行了BeanFactoryAware:BeanFactory = " + beanFactory);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("执行了ApplicationContextAware:ApplicationContext = " + applicationContext);
    }

    /**
     * 执行初始化前置方法
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行初始化前置方法");
        return bean;
    }

    /**
     * 执行初始化方法
     */
    //xml 方式的初始化方法
    public void init(){
        System.out.println("XML 方式初始化");
    }

    //注解 方式初始化
    @PostConstruct
    public void postConstruct() {
        System.out.println("注解 方式初始化");
    }

    /**
     * 执行初始化后置方法
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行初始化后置方法");
        return bean;
    }

    /**
     * 使用Bean
     */
    public void sayHi(){
        System.out.println("使用Bean");
    }

    /**
     * 销毁Bean
     */
    @PreDestroy
    public void preDestroy() {
        System.out.println("销毁Bean");
    }
}

BeanLifeTest.java

import com.example.BeanLifeComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanLifeTest {
    public static void main(String[] args) {
        //得到 Spring 容器,通过配置文件让Spring容器自动完成对象的实例化和属性注入。
        // 这里使用 ClassPathXmlApplicationContext 而不是 ApplicationContext,因为这个类没有destroy()或者close()方法。
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        //获取Bean
        BeanLifeComponent bean = context.getBean("beanLifeComponent", BeanLifeComponent.class);

        //使用Bean
        bean.sayHi();

        //销毁Bean。下面两种方法等效
        //context.destroy();
        context.close();
    }
}

运行 BeanLifeTest.java 打印结果:
Bean的生命周期及演示
从打印结果我们可以发现:
1.使用注解方式初始化Bean比使用xml的优先级高。
2.为什么没有执行初始化前置和后置方法?
答:因为Bean的作用域默认是单例,Spring会自动调用初始化前置方法和后置方法,我们不能显示调用。要想显示调用,把Bean的作用域改为 prototype 即多例模式。可以在XML配置文件中使用元素的scope属性修改,也可在Bean定义中使用@Scope注解修改。


修改后
Bean的生命周期及演示
再次运行打印结果:
Bean的生命周期及演示
可以发现:
1.方法执行了两次。一个是在应用上下文启动时初始化的实例,另一个是在执行 getBean 方法时返回一个新的实例并初始化。
2.为什么没有执行销毁方法?
答:是因为Spring设计,多例模式的 Bean 由于会创建多个实例,因此容器不会自动跟踪和销毁这些实例,而是直接停掉了整个线程。文章来源地址https://www.toymoban.com/news/detail-441940.html

到了这里,关于Bean的生命周期及演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring bean 生命周期

    在互联网领域中,Spring框架扮演着重要的角色。作为一个开源的Java应用程序开发框架,Spring提供了一种灵活而强大的方式来构建可扩展的应用程序。Spring框架中的一个重要概念是Bean,它是Spring应用程序的基本构建块之一。了解Spring Bean的生命周期对于充分利用Spring框架的功能

    2024年02月11日
    浏览(45)
  • 【Spring】Bean的作用域与生命周期详情:请简述Spring的执行流程并分析Bean的生命周期?

     我们都知道,Spring框架为开发人员提供了很多便捷,这使得开发人员能够更加专注于应用程序的核心业务逻辑,而不需要花费大量时间和精力在技术细节上。作为一个包含众多工具方法的IoC容器,存取JavaBean是其极为重要的一个环节。本文就对Spring中的Bean的作用域和生命周

    2024年02月12日
    浏览(48)
  • Spring -- Bean的生命周期

    Spring容器在进行实例化时,会将xml配置的bean的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean   BeanDefinition 中几个重要方法如下 beanClassName:bean 的类名 initMethodName:初始化方法名称 properryValues:bean 的属性值 scope:作用域

    2024年02月15日
    浏览(53)
  • Spring Bean的生命周期

    Bean生命周期的整个执行过程描述如下: 1、根据配置情况调用Bean构造方法或工厂方法实例化 Bean。 2、利用依赖注入完成Bean中所有属性值的配置注入。 3、如果Bean 实现了BeanNameAware 接口,则 Spring调用Bean的setBeanName()方法传入当前Bean的id值。 4、如果Bean实现了BeanFactoryAware 接口

    2023年04月22日
    浏览(61)
  • 详解Spring Bean的生命周期

    Spring Bean的生命周期包括以下阶段: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。 对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean。

    2024年02月14日
    浏览(50)
  • Spring源码:Bean生命周期(三)

    在之前的文章中,我们已经对 bean 的准备工作进行了讲解,包括 bean 定义和 FactoryBean 判断等。在这个基础上,我们可以更加深入地理解 getBean 方法的实现逻辑,并在后续的学习中更好地掌握 createBean 方法的实现细节。 讲解getBean方法之前,我们先来看看他有几种常见的用法:

    2024年02月02日
    浏览(45)
  • Spring(11) Bean的生命周期

    首先,为什么要学习 Spring 中 Bean 的生命周期呢? 虽然不了解 Bean 的生命周期,并不影响日常工作中的开发。但是如果我们了解了 Bean 的生命周期,可以帮助我们更好地掌握 Spring 框架,并且能够让我们更好地去理解 Spring 容器是如何管理和创建 Bean 示例的。如果以后遇到 B

    2024年02月14日
    浏览(37)
  • Spring Bean的生命周期解读

    目录   1. Spring IOC容器 1.1 Spring IOC 容器的设计 1.1.1 BeanFactory 1.1.2 ApplicationContext 1.2 Spring Bean的生命周期 1.2.1 BeanDefinition 1.2.2 InstantiationAwareBeanPostProcessor和BeanPostProcessor 1.2.3 测试生命周期   Spring IOC 容器的设计主要是基于 BeanFactory 和 ApplicationContex t两个接口,其中ApplicationConte

    2024年02月11日
    浏览(39)
  • Spring源码:Bean生命周期(终章)

    本系列前面讲解了Spring的bean定义、bean实例化、bean初始化等生命周期。这些步骤使我们能够了解bean从创建到准备好使用所经历的过程。但是,除了这些步骤,bean的销毁也是非常重要的一步。在本系列的最后,我们将深入探讨bean的销毁过程,包括在什么情况下会发生销毁、销

    2024年02月06日
    浏览(51)
  • Spring源码:Bean生命周期(五)

    在上一篇文章中,我们深入探讨了 Spring 框架中 Bean 的实例化过程,该过程包括从 Bean 定义中加载当前类、寻找所有实现了 InstantiationAwareBeanPostProcessor 接口的类并调用实例化前的方法、进行实例化、调用 applyMergedBeanDefinitionPostProcessors 方法等多个步骤,最终生成了一个真正的

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包