深入了解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日

相关文章

  • java数组获取末尾元素

    以下是“Java数组获取末尾元素”的完整攻略: Java数组获取末尾元素 在Java中,您可以使用数组来存储一组相同类型的数据。有时候,您可能需要获取数组的末元素。本攻略将介绍如何在中获取数组的末尾元素。 方法1:使用数组长度 您可以使用数组长度来获取数组的末尾元素。数组的末尾元素的索是数组长度减1。例如,如果数组的长度为5,则末尾元素的索引为以下是一个示例…

    other 2023年5月7日
    00
  • 将FreeTextBox做成控件添加到工具箱中的具体操作方法

    将FreeTextBox做成控件添加到工具箱中可以方便我们在Windows窗体应用程序的设计中使用,下面给出具体的操作方法: 下载安装FreeTextBox的安装包,并安装在计算机上,例如安装路径为C:\FreeTextBox。 在Visual Studio中的Windows窗体应用程序项目中,右键单击工具箱中的任意一个工具,选择“选择项”,打开“Choos…

    other 2023年6月27日
    00
  • vivoPad2怎么退出开发者模式 vivoPad2关闭开发者模式教程

    vivoPad2是vivo品牌的一款平板电脑,在使用vivoPad2开发者模式时,需要谨慎操作。如果要退出开发者模式或关闭开发者模式,可以按照以下步骤进行。 退出开发者模式 打开设备的“设置”应用,滑动到底部,找到“开发者选项”。 点击“开发者选项”,滑动到最下面,找到“关闭开发者选项”。 点击“关闭开发者选项”。 系统会提示你“关闭开发者选项”,点击“确定…

    other 2023年6月26日
    00
  • JS中如何判断传过来的JSON数据中是否存在某字段

    可以通过JS中Object的hasOwnProperty方法来判断一个传入的JSON数据中是否存在某个字段。hasOwnProperty方法可以检测一个Object对象自身是否包含指定的属性,如果包含,则返回true,否则返回false。 以下是示例代码: const jsonObj = {"name": "Tom",…

    other 2023年6月25日
    00
  • Android内存泄漏的轻松解决方法

    以下是“Android内存泄漏的轻松解决方法”的完整攻略: 1. 了解什么是内存泄漏 内存泄漏在Android开发中属于比较常见的问题,会导致应用程序中的内存长期占用,严重的话可能会导致内存溢出。因此,在解决内存泄漏问题之前,首先我们要了解什么是内存泄漏。 简单来说,内存泄漏就是应用程序在运行的过程中,分配的内存没有被正确释放,导致内存中出现垃圾数据,从而造…

    other 2023年6月27日
    00
  • Redis链表底层实现及生产实战

    Redis链表底层实现及生产实战 Redis链表是一种基于指针的双向链表,每个节点都包含指向前一个节点和后一个节点的指针。链表是Redis的重要数据结构,常用于实现有序集合(sorted set)和列表(list)等数据类型。本文将详细讲解Redis链表的底层实现及生产实战。 Redis链表的实现方式 Redis链表是一个非常典型的双向链表,节点包括prev…

    other 2023年6月27日
    00
  • java解析url的链接和参数

    以下是“Java解析URL链接和参数”的完整攻略: Java解析URL链接和参数 在Java中,您可以使用java.net.URL类解析URL链接和参数。以下是如使用Java解URL链接和参数的步骤: 1. 创建URL对象 要解析URL链接和参数首先需要创建一个URL对象。例如,以下如创建一个URL对象的代码: URL url = new URL(&quot…

    other 2023年5月7日
    00
  • Element中el-input密码输入框浏览器自动填充账号密码问题的解决方法

    当使用Element的<el-input>组件创建密码输入框时,会遇到浏览器自动填充账号密码的问题。这个问题可能会影响页面的安全性,同时给用户带来不便。本文将详细讲解如何解决这个问题。 问题的产生 浏览器在填充表单的时候,会检测该表单是否具有自动填充的特性。在密码输入框中,如果同时存在一个隐藏的<input>元素,并且该元素的名称为u…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部