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

作者:这堆干货有点猛 时间:2023-08-09 11:41:15 

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属性传递给构造方法。在这个例子中,我们将参数值设置为&ldquo;John&rdquo;,这将被传递给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 属性来指定工厂方法注入的方法名。在该属性中,我们将方法名设置为 &ldquo;createUser&rdquo;,这将被调用来实例化 User 对象。在这个例子中,我们将参数值设置为 &ldquo;John&rdquo;,这将被传递给 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 方法。在这个例子中,我们将属性名设置为 &ldquo;name&rdquo;,属性值设置为 &ldquo;John&rdquo;,这将被注入到 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 属性传递给构造方法。在这个例子中,我们将参数值设置为 &ldquo;John&rdquo;,这将被传递给 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 属性来指定初始化方法。在该属性中,我们将方法名设置为 &ldquo;init&rdquo;,这将被调用来执行初始化操作。在这个例子中,我们将属性名设置为 &ldquo;name&rdquo;,属性值设置为 &ldquo;John&rdquo;,这将被注入到 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 属性来指定销毁方法。在该属性中,我们将方法名设置为 &ldquo;destroy&rdquo;,这将被调用来执行清理操作。在这个例子中,我们将属性名设置为 &ldquo;name&rdquo;,属性值设置为 &ldquo;John&rdquo;,这将被注入到 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 方法。

来源:https://juejin.cn/post/7218001191702839353

标签:Spring,Bean,生命周期
0
投稿

猜你喜欢

  • 递归法求最大公约数和最小公倍数的实现代码

    2023-10-07 02:11:34
  • Mybatis全局配置及映射关系的实现

    2022-07-03 09:31:39
  • Maven的生命周期与自定义插件实现方法

    2022-04-06 20:13:48
  • Mybatis-Plus注入SQL原理分析

    2022-11-09 21:17:22
  • 详解配置spring-boot-actuator时候遇到的一些小问题

    2022-03-17 17:04:08
  • springboot实现注册加密与登录解密功能(demo)

    2021-12-15 15:10:08
  • Android使用WebView实现全屏切换播放网页视频功能

    2021-10-19 18:21:16
  • Android继承ViewGroup实现Scroll滑动效果的方法示例

    2023-09-20 16:21:42
  • Java动态代 理分析及简单实例

    2023-11-24 21:14:56
  • Zookeeper连接超时问题与拒绝连接的解决方案

    2023-11-20 03:41:29
  • java中javamail发送带附件的邮件实现方法

    2023-12-06 02:46:30
  • Android编程下拉菜单spinner用法小结(附2则示例)

    2022-11-02 20:25:45
  • Flutter 自定义Drawer 滑出位置的大小实例代码详解

    2021-09-18 23:18:19
  • 2020最新 idea下载、安装与创建项目测试的教程图解

    2023-10-22 08:08:14
  • spring boot补习系列之几种scope详解

    2022-06-10 13:39:13
  • 如何优雅的进行Spring整合MongoDB详解

    2022-10-23 05:24:19
  • Android实现手机壁纸改变的方法

    2022-06-03 07:41:46
  • 在Java中按值调用和按引用调用

    2021-12-26 20:09:21
  • 字符串阵列String[]转换为整型阵列Int[]的实例

    2021-07-22 08:19:17
  • Android直播软件搭建之实现背景颜色滑动渐变效果的详细代码

    2022-03-24 21:18:54
  • asp之家 软件编程 m.aspxhome.com