全面详解Spring Bean生命周期教程示例

目录
  • Spring 中 Bean 的生命周期
  • Bean 的实例化
    • 构造方法注入
    • 工厂方法注入
  • Bean 的属性赋值
    • setter注入
    • 构造方法注入
  • Bean 的初始化
    • 初始化方法
    • InitializingBean 接口
  • Bean 的销毁
    • 销毁方法
    • DisposableBean 接口
  • 总结

Spring 中 Bean 的生命周期

是当今最流行的 Java 开发框架之一,其强大的 Bean容器机制是其中的核心之一。Bean 是指在 Spring 容器中被管理的对象,它们可以被注入到其他对象中,也可以被其他对象所依赖。在 Spring 容器中,每个 Bean 都有一个生命周期,Spring 提供了丰富的生命周期回调方法,允许我们在 Bean 的生命周期中执行自己的特定操作。

本文将详细介绍 Spring 中 Bean 的生命周期,包括 Bean 的实例化、属性赋值、初始化和销毁等步骤。同时,我们将通过一些源码示例来解析 Spring 是如何实现 Bean 的生命周期的。

Bean 的实例化

Bean 的实例化是指容器创建 Bean 对象的过程。Bean 的实例化方式有两种:构造方法注入工厂方法注入

构造方法注入

构造方法注入是指 Spring 容器通过调用 Bean 的构造方法来实例化 Bean 对象。在构造方法注入中,我们需要在 Bean 的类中定义一个构造方法用于 Bean 的实例化。Spring 容器在实例化 Bean 时,会根据 Bean 的类定义找到对应的构造方法,并通过反射机制来调用该构造方法。

下面是一个示例代码,演示了如何在 Bean 类中定义一个构造方法,并通过构造方法注入来实例化 Bean 对象。

public class User {
    private String name;
    public User(String name) {
        this.name = name;
    }
    // getter and setter methods
}

在上面的代码中,我们定义了一个名为 User 的 Bean 类,并在该类中定义了一个构造方法,用于实例化 User 对象。在该构造方法中,我们将传入的name参数赋值给 User 对象的 name 属性。

<bean id="user" class="com.example.User">
    <constructor-arg value="John" />
</bean>

在上面的配置文件中,我们使用constructor-arg 元素来指定构造方法注入的参数。在该元素中,我们将参数值通过value属性传递给构造方法。在这个例子中,我们将参数值设置为“John”,这将被传递给User的构造方法,用于实例化User对象。

工厂方法注入

工厂方法注入是指 Spring 容器通过调用 Bean 的工厂方法来实例化 Bean 对象。在工厂方法注入中,我们需要在 Bean 的类中定义一个工厂方法,用于 Bean 的实例化。

Spring 容器在实例化 Bean 时,会根据 Bean 的类定义找到对应的工厂方法,并通过反射机制来调用该工厂方法。

下面是一个示例代码,演示了如何在 Bean 类中定义一个工厂方法,并通过工厂方法注入来实例化 Bean 对象。

public class UserFactory {
    public static User createUser(String name) {
        return new User(name);
    }
}
public class User {
    private String name;
    public User(String name) {
        this.name = name;
    }
    // getter and setter methods
}

在上面的代码中,我们定义了一个名为 UserFactory 的工厂类,并在该类中定义了一个名为 createUser 的工厂方法,用于实例化User对象。在该工厂方法中,我们将传入的 name 参数传递给User的构造方法,并返回一个新的 User 对象。

<bean id="user" class="com.example.UserFactory" factory-method="createUser">
    <constructor-arg value="John" />
</bean>

在上面的配置文件中,我们使用 factory-method 属性来指定工厂方法注入的方法名。在该属性中,我们将方法名设置为 “createUser”,这将被调用来实例化 User 对象。在这个例子中,我们将参数值设置为 “John”,这将被传递给 User 的构造方法,用于实例化 User 对象。

Bean 的属性赋值

Bean 的属性赋值是指 Spring 容器将配置文件中的属性值注入到 Bean 对象中的过程。在 Spring 容器中,Bean 的属性赋值方式有两种:setter 注入和构造方法注入。

setter注入

setter注入是指 Spring 容器通过调用 Bean 的 setter 方法来注入属性值。在 setter 注入中,我们需要在 Bean 的类中定义 setter 方法用于属性注入。

Spring 容器在实例化 Bean 后,会根据配置文件中的 property 元素来找到对应的 setter 方法,并通过反射机制来调用该方法,将属性值注入到 Bean 对象中。

下面是一个示例代码,演示了如何在 Bean 类中定义 setter 方法,并通过 setter 注入来注入属性值。

public class User {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    // getter method
}

在上面的代码中,我们定义了一个名为User的 Bean 类,并在该类中定义了一个 setName 方法,用于注入 name 属性。在该方法中,我们将传入的 name 参数赋值给 User 对象的 name 属性。

<bean id="user" class="com.example.User">
    <property name="name" value="John" />
</bean>

在上面的配置文件中,我们使用 property 元素来指定 setter 注入的属性值。在该元素中,我们将属性名通过 name 属性传递给 setter 方法,并将属性值通过 value 属性传递给 setter 方法。在这个例子中,我们将属性名设置为 “name”,属性值设置为 “John”,这将被注入到 User 对象中的 name 属性中。

构造方法注入

构造方法注入是指 Spring 容器通过调用 Bean 的构造方法来注入属性值。在构造方法注入中,我们需要在 Bean 的类中定义一个构造方法用于属性注入。

Spring 容器在实例化 Bean 时,会根据配置文件中的 constructor-arg 元素来找到对应的构造方法,并通过反射机制来调用该构造方法,将构造方法注入的参数值注入到 Bean 对象中。

下面是一个示例代码,演示了如何在 Bean 类中定义一个构造方法,并通过构造方法注入来注入属性值。

    public class User {
    private String name;
    public User(String name) {
        this.name = name;
    }
    // getter method
}

在上面的代码中,我们定义了一个名为User的 Bean 类,并在该类中定义了一个构造方法,用于注入 name 属性。在该构造方法中,我们将传入的 name 参数赋值给 User 对象的 name 属性。

<bean id="user" class="com.example.User">
    <constructor-arg value="John" />
</bean>

在上面的配置文件中,我们使用 constructor-arg 元素来指定构造方法注入的参数值。在该元素中,我们将参数值通过 value 属性传递给构造方法。在这个例子中,我们将参数值设置为 “John”,这将被传递给 User 的构造方法,用于注入 User 对象中的 name 属性。

Bean 的初始化

Bean 的初始化是指 Spring 容器在实例化 Bean 对象后,执行一些初始化操作的过程。在 Spring 容器中, Bean 的初始化方式有两种:初始化方法InitializingBean 接口。

初始化方法

初始化方法是指我们在 Bean 的类中定义一个方法,该方法会在 Bean 实例化后被 Spring 容器调用,用于执行一些初始化操作。在初始化方法中,我们可以执行一些自定义的操作,例如初始化一些属性或者建立一些数据库连接等。

下面是一个示例代码,演示了如何在 Bean 类中定义一个初始化方法,并通过 bean 元素来指定该方法。

public class User {
    private String name;
    public void init() {
        System.out.println("User bean is initialized.");
    }
    // getter and setter methods
}

在上面的代码中,我们定义了一个名为 init 的初始化方法,用于执行一些初始化操作。在该方法中,我们输出一些信息,以表明该方法被调用了。

<bean id="user" class="com.example.User" init-method="init">
    <property name="name" value="John" />
</bean>

在上面的配置文件中,我们使用 init-method 属性来指定初始化方法。在该属性中,我们将方法名设置为 “init”,这将被调用来执行初始化操作。在这个例子中,我们将属性名设置为 “name”,属性值设置为 “John”,这将被注入到 User 对象中的 name 属性中。

InitializingBean 接口

InitializingBean 接口是 Spring 框架提供的一个接口,该接口定义了一个名为 afterPropertiesSet 的方法,该方法会在 Bean 实例化后被 Spring 容器调用,用于执行一些初始化操作。在 afterPropertiesSet 方法中,我们可以执行一些自定义的操作,例如初始化一些属性或者建立一些数据库连接等。

下面是一个示例代码,演示了如何在 Bean 类中实现 InitializingBean 接口,并通过 bean 元素来指定该 Bean 实现了 InitializingBean 接口。

public class User implements InitializingBean  {
    private String name;
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("User bean is initialized.");
    }
    // getter and setter methods
}

在上面的代码中,我们实现了 InitializingBean 接口,并在 afterPropertiesSet 方法中输出一些信息,以表明该方法被调用了。

<bean id="user" class="com.example.User">
    <property name="name" value="John" />
</bean>

在上面的配置文件中,我们不需要指定初始化方法,因为我们已经在User类中实现了 InitializingBean 接口, Spring 容器会自动调用 afterPropertiesSet 方法。

Bean 的销毁

Bean 的销毁是指 Spring 容器在关闭时,执行一些清理操作的过程。在 Spring 容器中, Bean 的销毁方式有两种:销毁方法和 DisposableBean 接口。

销毁方法

销毁方法是指我们在 Bean 的类中定义一个方法,该方法会在 Spring 容器关闭时被调用,用于执行一些清理操作。在销毁方法中,我们可以执行一些自定义的操作,例如关闭一些数据库连接等。

下面是一个示例代码,演示了如何在 Bean 类中定义一个销毁方法,并通过 bean 元素来指定该方法。

public class User {
    private String name;
    public void destroy() {
        System.out.println("User bean is destroyed.");
    }
    // getter and setter methods
}

在上面的代码中,我们定义了一个名为 destroy 的销毁方法,用于执行一些清理操作。在该方法中,我们输出一些信息,以表明该方法被调用了。

<bean id="user" class="com.example.User" destroy-method="destroy">
    <property name="name" value="John" />
</bean>

在上面的配置文件中,我们使用 destroy-method 属性来指定销毁方法。在该属性中,我们将方法名设置为 “destroy”,这将被调用来执行清理操作。在这个例子中,我们将属性名设置为 “name”,属性值设置为 “John”,这将被注入到 User 对象中的 name 属性中。

DisposableBean 接口

DisposableBean 接口是 Spring 框架提供的一个接口,该接口定义了一个名为 destroy 的方法,该方法会在 Spring 容器关闭时被调用,用于执行一些清理操作。在 destroy 方法中,我们可以执行一些自定义的操作,例如关闭一些数据库连接等。

下面是一个示例代码,演示了如何在 Bean 类中实现 DisposableBean 接口,并通过 bean 元素来指定该 Bean 实现了 DisposableBean 接口。

public class User implements DisposableBean  {
    private String name;
    @Override
    public void destroy() throws Exception {
        System.out.println("User bean is destroyed.");
    }
    // getter and setter methods
}

在上面的代码中,我们实现了 DisposableBean 接口,并在 destroy 方法中输出一些信息,以表明该方法被调用了。

<bean id="user" class="com.example.User">
    <property name="name" value="John" />
</bean>

在上面的配置文件中,我们不需要指定销毁方法,因为我们已经在User类中实现了 DisposableBean 接口, Spring 容器会自动调用 destroy 方法。

总结

Spring 的 Bean 容器机制是非常强大的,它可以帮助我们轻松地管理 Bean 对象,并且提供了丰富的生命周期回调方法,允许我们在 Bean 的生命周期中执行自己的特定操作。因此,对于 Java 开发者来说,掌握 Spring 框架的 Bean 容器机制是非常重要的。

以上就是全面详解Spring Bean生命周期教程示例的详细内容,更多关于Spring Bean生命周期的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringIOC容器Bean的作用域及生命周期实例

    目录 bean作用域 1. 默认单实例 2. 设置多实例 bean生命周期 一.生命周期过程示例 二.更完整的过程 1. 创建后置处理器 bean作用域 bean的作用域,其实就是设置创建 bean 的实例是属于单实例,还是多实例. 1. 默认单实例 默认情况下,创建的 bean 是单实例对象. 比如,用之前的代码为例: @Test public void testCollection2() { ApplicationContext context = new ClassPathXmlAppli

  • Spring容器刷新obtainFreshBeanFactory示例详解

    目录 Spring容器刷新—02—obtainFreshBeanFactory BeanFactory和ApplicationContext obtainFreshBeanFactory 1.GenericApplicationContext系列的实现 2.AbstractRefreshableApplicationContext系列的实现 该使用哪个BeanFactory? Servlet环境 SpringBoot环境 Spring容器刷新—02—obtainFreshBeanFactory

  • SpringBoot用配置影响Bean加载@ConditionalOnProperty

    目录 故事背景 调试&解决 SpringBoot 是怎么做的 故事的最后 故事背景 故事发生在几个星期前,自动化平台代码开放给整个测试团队以后,越来越多的同事开始探索平台代码.为了保障自动化测试相关的数据和沉淀能不被污染,把数据库进行了隔离.终于有了2个数据库实例,一个给dev环境用,一个给test环境用.可是随着平台的发展,越来越多的中间件被引用了.所以需要隔离的东西就越来越多了,比如MQ,Redis等.成本越来越高,如果像数据库实例一样全部分开搞一套,那在当下全域降本增效的大潮下,也是困难重

  • spring 自动注入AutowiredAnnotationBeanPostProcessor源码解析

    目录 一.MergedBeanDefinitionPostProcessor 1.1.postProcessMergedBeanDefinition 1.1.1 findAutowiringMetadata 查询属性或方法上有@Value和@Autowired注解的元素 1.1.2 检查元数据信息 二.SmartInstantiationAwareBeanPostProcessor 2.1.determineCandidateConstructors 一.MergedBeanDefinition

  • Spring populateBean属性赋值和自动注入

    目录 正文 一.postProcessAfterInstantiation:修改Bean实例 二.autowireByName:根据名称自动注入 三.autowireByType:根据类型自动注入 四.postProcessPropertyValues:处理属性值(@Resource.@Autowired.@Value) 五.applyPropertyValues:填充属性 5.1 解析依赖 5.2 解析List 正文 protected void populateBean(String bea

  • Spring createBeanInstance实例化Bean

    目录 Spring实例Bean的方法 一.determineConstructorsFromBeanPostProcessors:确定构造参数 二.autowireConstructor:有参构造创建Bean 2.1 resolveConstructorArguments:解析参数并返回最小参数个数 2.2 createArgumentArray:创建构造参数数组 2.3 instantiate:实例化Bean 三.instantiateBean:无参构造创建Bean 无参构造 四.使用实例化策

  • 全面详解Spring Bean生命周期教程示例

    目录 Spring 中 Bean 的生命周期 Bean 的实例化 构造方法注入 工厂方法注入 Bean 的属性赋值 setter注入 构造方法注入 Bean 的初始化 初始化方法 InitializingBean 接口 Bean 的销毁 销毁方法 DisposableBean 接口 总结 Spring 中 Bean 的生命周期 是当今最流行的 Java 开发框架之一,其强大的 Bean容器机制是其中的核心之一.Bean 是指在 Spring 容器中被管理的对象,它们可以被注入到其他对象中,也可以

  • 谈谈我对Spring Bean 生命周期的理解

    前言 Spring的ioc容器功能非常强大,负责Spring的Bean的创建和管理等功能.而Spring 的bean是整个Spring应用中很重要的一部分,了解Spring Bean的生命周期对我们了解整个spring框架会有很大的帮助. BeanFactory和ApplicationContext是Spring两种很重要的容器,前者提供了最基本的依赖注入的支持,而后者在继承前者的基础进行了功能的拓展,例如增加了事件传播,资源访问和国际化的消息访问等功能.本文主要介绍了ApplicationCo

  • 详解Spring Bean的配置方式与实例化

    目录 一. Spring Bean 配置方式 配置文件开发 注解开发 二.Spring Bean实例化 环境准备 构造方法实例化Bean 静态工厂实例化Bean 实例工厂实例化Bean FactoryBean 一. Spring Bean 配置方式 由 Spring IoC 容器管理的对象称为 Bean,Bean 配置方式有两种:配置文件开发和注解开发 配置文件开发 Spring 配置文件支持两种格式:xml和properties,此教程以xml配置文件讲解. XML 配置文件的根元素是 <be

  • 详解Angular组件生命周期(一)

    概述 组件声明周期以及angular的变化发现机制 红色方法只执行一次. 变更检测执行的绿色方法和和组件初始化阶段执行的绿色方法是一个方法. 总共9个方法. 每个钩子都是@angular/core库里定义的接口. import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-life', templateUrl: './life.component.html', styleUrls: ['./life

  • 详解Spring bean的注解注入之@Autowired的原理及使用

    一.@Autowired 概念: @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法. 在使用@Autowired之前,我们对一个bean配置起属性时,用的是 <property name="属性名" value=" 属性值"/> 使用@Autowired之后,我们只需要在需要使用的地方使用一个@Autowired 就可以了. 代码使用: public

  • 详解Spring Bean的集合注入和自动装配

    目录 一.Spring Bean 集合注入 集合常用标签 案例 二.Spring Bean自动装配 什么是自动装配 自动装配的方式 案例 注意点 一.Spring Bean 集合注入 在[Spring学习笔记(三)]已经讲了怎么注入基本数据类型和引用数据类型,接下来介绍如何注入比较特殊的数据类型——集合 集合常用标签 集合注入,用法也很简单,只需要在 Bean 标签下的 <property> 或<constructor-arg>元素中添加以下集合的标签,再通过value或者ref进

  • Spring Bean生命周期详细分析

    目录 前言 一.Bean的介绍 什么是Bean Bean的生命周期 Bean的作用域 二.详细过程 1. Bean的实例化 2. InstantiationAwareBeanPostProcessor 3. 设置属性(依赖注入) 4. 注入Aware接口 5. BeanPostProcessor的postProcessBeforeInitialzation方法 6. InitializingBean与init-method 7. BeanPostProcess的postProcessAfterI

  • 浅谈Spring bean 生命周期验证

    一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware setBeanName 设置bean名称 2.BeanClassLoaderAware setBeanClassLoader 设置bean类加载器 3.BeanFactoryAware setBeanFactory 设置bean工厂 4.EnvironmentAware setEnvironment

  • Spring Bean生命周期源码原理图解

    概述 spring流行了很长时间了,是一个用java编写的轻量级框架,受到了很多公司及程序员的欢迎,Bean生命周期是一个对象从实例化开始到销毁的全过程,了解生命周期是很有必要的. 重要性 spring的生命周期是比较复杂的,只有了解其过程及原理才能更好的扩展程序. 源码剖析生命周期过程bean的实例化 属性填充及Aware接口检测设置依赖 如果容器自定义了BeanpostProcessor的实现类,则执行处理器相应的前置处理 bean实现了初始化接口InitlializingBean,则会执行

  • 详解Spring Bean的循环依赖解决方案

    如果使用构造函数注入,则可能会创建一个无法解析的循环依赖场景. 什么是循环依赖 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图: 注意,这里不是函数的循环调用,是对象的相互依赖关系.循环调用其实就是一个死循环,除非有终结条件. Spring中循环依赖场景有: (1)构造器的循环依赖 (2)field属性的循环依赖. 怎么检测是否存在循环依赖 检测循环依赖相对比较容易,Bean在创建的时候可以给该Bean打标,

随机推荐