深入了解Spring的Bean生命周期

Spring的Bean生命周期主要分为以下5个阶段:

  1. 实例化Bean:Spring容器创建Bean的实例,通过Java的反射机制实现对象的创建。

  2. 设置Bean属性值:Spring容器通过Spring配置文件或注解设置Bean的属性值。

  3. 调用Bean的初始化方法:Spring容器调用Bean的初始化方法,初始化方法可以通过注解方式和配置文件方式进行声明。

  4. Bean已经可以使用:Bean已经完全初始化,可以使用了。

  5. 调用Bean的销毁方法:Spring容器关闭时,会调用Bean的销毁方法,销毁方法可以通过注解方式和配置文件方式进行声明。

下面分别进行详细讲解:

1. 实例化Bean

Spring容器根据配置文件或注解创建Bean的实例,实例化的方式有两种:构造器方式和静态工厂方式。其中构造器方式又分为默认构造器和有参数构造器。示例代码如下:

public class User {
    private String name;
    private int age;

    public User() {
        System.out.println("User的构造器被调用");
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("User的有参数构造器被调用");
    }

    // 省略getter和setter方法
}
<bean id="user" class="com.xxx.User">
    <constructor-arg name="name" value="张三"/>
    <constructor-arg name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
    @Bean
    public User user() {
        return new User("李四", 20);
    }
}

2. 设置Bean属性值

Spring容器会调用Bean的setter方法或直接使用反射注入属性值。示例代码如下:

public class User {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
        System.out.println("User的setName方法被调用");
    }

    public void setAge(int age) {
        this.age = age;
        System.out.println("User的setAge方法被调用");
    }

    // 省略getter和setter方法
}
<bean id="user" class="com.xxx.User">
    <property name="name" value="张三"/>
    <property name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
    @Bean
    public User user() {
        User user = new User();
        user.setName("李四");
        user.setAge(20);
        return user;
    }
}

3. 调用Bean的初始化方法

当Bean实例化和属性注入完成后,Spring容器会去调用Bean的初始化方法。初始化方法可以通过@PostConstruct注解和init-method属性进行声明。示例代码如下:

public class User {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @PostConstruct
    public void init() {
        System.out.println("User的初始化方法被调用");
    }

    // 省略getter和setter方法
}
<bean id="user" class="com.xxx.User" init-method="init">
    <property name="name" value="张三"/>
    <property name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
    @Bean(initMethod = "init")
    public User user() {
        User user = new User();
        user.setName("李四");
        user.setAge(20);
        return user;
    }
}

4. Bean已经可以使用

Bean实例化、属性注入和初始化方法执行完成后,Bean可以被应用程序调用。示例代码如下:

public class UserService {
    private User user;

    public UserService(User user) {
        this.user = user;
    }

    public void hello() {
        System.out.println("Hello, " + user.getName());
    }
}
@Configuration
public class AppConfig {
    @Bean(initMethod = "init")
    public User user() {
        User user = new User();
        user.setName("李四");
        user.setAge(20);
        return user;
    }

    @Bean
    public UserService userService(User user) {
        return new UserService(user);
    }
}

5. 调用Bean的销毁方法

当Spring容器关闭时,会调用Bean的销毁方法。销毁方法可以通过@PreDestroy注解和destroy-method属性进行声明。示例代码如下:

public class User {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @PostConstruct
    public void init() {
        System.out.println("User的初始化方法被调用");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("User的销毁方法被调用");
    }

    // 省略getter和setter方法
}
<bean id="user" class="com.xxx.User" init-method="init" destroy-method="destroy">
    <property name="name" value="张三"/>
    <property name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public User user() {
        User user = new User();
        user.setName("李四");
        user.setAge(20);
        return user;
    }
}

通过以上内容,我们已经深入了解了Spring的Bean生命周期。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解Spring的Bean生命周期 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 前端算法题解leetcode114二叉树展开为链表

    关于前端算法题解leetcode114二叉树展开为链表,我给出完整的攻略如下: 问题概述 给定一个二叉树,原地将它展开为一个单链表。其中,展开后的单链表应该符合如下要求: 单链表的右节点指针为原先的二叉树中序遍历的后继节点。 单链表的左节点应该为空(因为右节点指针已经代替了左右子树指针)。 例如,给定如下二叉树: 1 / \ 2 5 / \ \ 3 4 6 …

    other 2023年6月27日
    00
  • 正则表达式教程之匹配单个字符详解

    当然!下面是关于\”正则表达式教程之匹配单个字符详解\”的完整攻略: 正则表达式教程之匹配单个字符详解 正则表达式是一种强大的模式匹配工具,用于在文本中查找和匹配特定的模式。在正则表达式中,我们可以使用不同的元字符来匹配单个字符。下面是一些常用的元字符及其含义: .:匹配任意单个字符,除了换行符。 \\w:匹配任意字母、数字或下划线字符。 \\d:匹配任意数…

    other 2023年8月19日
    00
  • android apk反编译,重新打包,签名

    Android APK反编译、重新打包、签名 简介 随着移动设备使用的普及,Android应用已经成为人们日常生活中不可或缺的一部分。开发者们通过编写APK程序来进行应用的开发。但是,在开发完成后,APK文件不可避免的需要进行重打包、签名等操作。这篇文章将介绍如何对APK进行反编译、重新打包以及签名的具体步骤。 APK反编译 APK反编译是一种将已编译的AP…

    其他 2023年3月28日
    00
  • 时空云-下一代互联网生态的领航者

    下面是关于“时空云-下一代互联网生态的领航者”的完整攻略: 1. 时空云的概述 时空云是一家以云计算、大数据、人工智能、区块链等技术为核心的企业,力于打造下一代互联网生态。时空云的愿景是成为全球领的云计算、大数据、人工智能区块链等技术服务提供商,为客户提供高效、安全、可靠云计算、大数据、人工智能、区块链等技术服务。 2. 时空云的主要业务 时空云的主要业务包…

    other 2023年5月7日
    00
  • 在win7下安装CAD时系统提示1606错误的可行解决方案

    下面是对于win7下安装CAD时系统提示1606错误的可行解决方案的完整攻略。本文将分为以下几个步骤: 了解1606错误 解决方案一:修改注册表 解决方案二:创建虚拟目录 了解1606错误 1606错误是指找不到网络位置的错误。通常在安装软件时,会出现这个错误。原因是安装程序找不到所需文件的位置,也就是说安装程序认为文件存放在某个位置,但实际上不存在。 解决…

    other 2023年6月26日
    00
  • c#之stream

    c#之stream 在C#语言中,流(Stream)是处理输入输出(I/O)的机制,它允许我们以统一的方式读写不同类型的数据(例如字节、字符、对象等),不论它们是来自文件、网络、内存还是其他数据源。 Stream的基本概念 Stream是一个抽象基类,它定义了一组用于访问数据流的通用方法和属性。在C#中,常用的Stream子类包括FileStream、Mem…

    其他 2023年3月29日
    00
  • IOS实现自定义布局瀑布流

    下面是iOS实现自定义布局瀑布流的完整攻略: 1. 瀑布流布局简介 瀑布流布局指根据元素高度不同,按照一定的规则排列在网页或app页面上的布局方式,最早出现在Pinterest网站上,可以更好地展示图片等不同高度的元素。在iOS中,可以采用UICollectionView来实现瀑布流布局。 2. 实现瀑布流布局 2.1 UICollectionView自定义…

    other 2023年6月26日
    00
  • base64怎样转pdf前端

    Base64怎样转PDF前端 在前端开发中,经常需要将一些数据进行编码和解码。其中,Base64编码是常用的一种编码方式,它可以将二进制数据转换为可打印的ASCII字符集,便于传输和显示。在这篇文章中,我们将讨论如何使用Base64编码将PDF文件转换为前端可读取的数据。 1. Base64编码 Base64编码是一种用于在网络上传输二进制数据的编码方法,它…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部