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

相关文章

  • python实现合并两个排序的链表

    下面是“python实现合并两个排序的链表”的完整攻略: 1. 题目描述 给定两个排好序的链表,将这两个链表合并成一个新的链表并返回。 例如,输入链表1为 1->2->4,链表2为 1->3->4,则合并后的新链表为 1->1->2->3->4->4。 2. 思路 定义新链表的头结点; 定义一个游标,指向…

    other 2023年6月28日
    00
  • mavenrepository库

    以下是关于Maven Repository库的完整攻略: 什么是Maven Repository库? Maven Repository库是一个用于存储和共享Java项目依赖项的中央存储库。它包含了大量的Java库和框架,可以通过Maven或Gradle等构建工具来访问和使用。 如何使用Maven Repository库? 以下是使用Maven Reposit…

    other 2023年5月6日
    00
  • U盘文件夹变空文件夹的文件名乱码的修复方法

    针对“U盘文件夹变空文件夹的文件名乱码”的修复方法,我整理了以下完整攻略: 问题描述 使用U盘存储文件时,发现某些文件夹因为某些原因变成了空文件夹,并且文件夹的文件名变为乱码。这时候打开文件夹,里面没有任何文件,但是U盘的存储空间却不会反映出来。这种情况下如何修复这些文件夹? 解决方案 这种情况下,通常是因为U盘发生了错误而导致的。我们可以采用如下方法进行修…

    other 2023年6月26日
    00
  • JavaScript中 创建动态 QML 对象的方法

    以下是使用标准的Markdown格式文本,详细讲解JavaScript中创建动态QML对象的方法的完整攻略: JavaScript中创建动态QML对象的方法 在JavaScript中,可以使用Qt的QML语言来创建动态对象。下面是两种常用的方法: 方法一:使用Qt.createQmlObject函数 可以使用Qt的createQmlObject函数来动态创建…

    other 2023年10月14日
    00
  • Java中LinkedList数据结构的详细介绍

    下面就来讲解一下Java中LinkedList数据结构的详细介绍。 什么是LinkedList数据结构 LinkedList是Java中的一个双向链表数据结构。它不是像ArrayList一样使用一个数组来存储数据,而是以节点(Node)的形式存储数据,每个节点内部包含数据和下一个节点的引用。因此,LinkedList支持快速地在列表中添加和删除元素,而不会影…

    other 2023年6月27日
    00
  • es删除已存在的索引

    在ES6中,数组的delete方法已经被废弃,不能用于删除已存在的索引。但是,我们可以使用splice()方法来删除数组中的元素。本攻略将详细讲解如何使用splice()方法来删除数组中的元素,并提供两个示例说明。 使用splice()方法删除数组中的元素 splice()方法可以用于删除数组中的元素。以下是splice()方法的语法: array.spli…

    other 2023年5月5日
    00
  • 转:SqlServer2012自增列值突然增大1000的原因及解决方法

    转:SqlServer2012自增列值突然增大1000的原因及解决方法 最近有些开发者反馈他们使用SqlServer2012时,数据库表的自增列突然增大了1000个,这对于表中数据量较大的情况下显得异常夸张,特此总结原因及解决方法。 问题原因 主要原因就是Sql Server 2012在自增列管理上的性能优化,当自增列的当前值被完全使用时,SqlServer…

    其他 2023年3月28日
    00
  • 微信小程序自定义弹窗实现详解(可通用)

    微信小程序自定义弹窗实现详解(可通用) 1.需求分析 在小程序中,有时候需要弹出一个自定义样式的弹窗,以提示用户或获得用户的确认。 2.实现过程 2.1 自定义组件 首先,在小程序中我们需要创建一个自定义组件,用于承载弹窗的内容。在组件的 wxml 文件中,可以编写弹窗的样式和内容。 <!– 弹窗组件 –> <view class=&q…

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