全面详解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属性传递给构造方法。在这个例子中,我们将参数值设置为“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 方法。
来源:https://juejin.cn/post/7218001191702839353


猜你喜欢
- 一)URL代理请求 该方式请求有两种代理方式。方式一:使用该方式代理之后,之后的所有接口都会使用代理请求// 对http开启全局代理Syst
- 概述JDK的bin目录下提供了很多命令工具,比如java.exe,javap.exe,javac.exe。。。。。。这些命令由jdk/lib
- 背景断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解决起来更加的灵活,我们完全可
- 本文将带领大家使用基于JAX-RS REST风格的实现Jersey来上传文件到服务器制定的文件夹,如果是图片并读取显示出该图片。准备工作:准
- 开始 在本文中,我将展示如何使用各种不同的 Java 技术构建一些简单的 Comet 风格的 Web 应
- 本文实例为大家分享了C#实现数字华容道游戏的具体代码,供大家参考,具体内容如下代码如下:using System;using System.
- 重载:方法名相同,但参数不同的多个同名函数注意:1.参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同2.返回值和异常以及访问修饰符
- 常用配置ObjectMapper objectMapper = new ObjectMapper();objectMapper.config
- 前言 侧滑的实现方式有很多方式来实现,这次总结的ViewDragHe
- Java Config 下的Spring Test方式用了三种方式:1.纯手动取bean:package com.wang.test;imp
- 上一小节我们学习了FastThreadLocal的创建和get方法的实现逻辑, 这一小节学习FastThreadLocal的set方法的实现
- 小编今天研究了在Unity3D中的数据持久化问题。数据持久化在任何一个开发领域都是一个值得关注的问题,小到一个应用中配置文件的读写,大到数据
- 本文实例为大家分享了Android实现3D层叠式卡片图片展示的具体代码,供大家参考,具体内容如下先看效果好了效果看了,感兴趣的往下看哦!整体
- Java注解介绍基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,
- 1、定义一个接口 Animalpackage com.zh.vo;public interface Animal { void
- 本文实例讲述了spring多数据源配置实现方法。分享给大家供大家参考,具体如下:在网上找到的配置多数据源的方法。1.扩展 org.sprin
- 前言《模式策略的角色扮演游戏》游戏是自制的角色扮演游戏。选择两个角色,然后进行PK,可用来学习JAVA的接口,继承和多态。主要设计1.事先设
- Java 8新特性方法引用对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容!Java 8的方法引用定义
- 本文实例讲述了Java面向对象程序设计:继承,多态用法。分享给大家供大家参考,具体如下:本文内容:继承多态首发时期:2018-03-23继承
- Eclipse 最佳字体 推荐:步骤:Eclipse->Windows[窗口]->Preferences[首选项]->Ge