作为Java程序员还不知道Spring中Bean创建过程和作用?

简介: 作为Java程序员还不知道Spring中Bean创建过程和作用?

1.简单的来说

Spring框架中,Bean的生命周期是指一个Bean从创建到销毁的过程。包括以下几个阶段:

  1. 实例化:当Spring容器启动时,会根据配置文件或注解等方式创建Bean的实例。
  2. 属性赋值:在实例化完成后,Spring容器会自动将相应的属性值赋值给Bean的成员变量。
  3. BeanPostProcessor前置处理器:在属性赋值完成后,Spring容器会调用BeanPostProcessor接口的postProcessBeforeInitialization方法,可以在该方法中对Bean进行一些自定义处理。
  4. 自定义初始化方法:如果需要在初始化时执行一些自定义逻辑,可以在Bean中定义一个初始化方法,并在该方法中编写相应的逻辑。Spring容器会自动调用该方法。
  5. BeanPostProcessor后置处理器:在自定义初始化方法执行完成后,Spring容器会调用BeanPostProcessor接口的postProcessAfterInitialization方法,可以在该方法中对Bean进行一些自定义处理。
  6. 注册监听器:在Bean初始化完成后,Spring容器会将该Bean注册到ApplicationContext中,以便其他组件可以访问和使用该Bean。

Bean的生命周期中,可以进行许多操作,例如自定义初始化和销毁方法、注入属性、设置依赖关系等。

2.Spring中Bean的生命周期就是Bean在Spring中从创建到销毁的整个过程,主要分为以下5个部分

1.实例化: 给Bean分配内存空间(对应JVM中的“加载”,这里只是分配了内存);

2.设置属性: 进行Bean的注入和装配;

3.初始化:

执行各种通知;

执行初始化的前置工作;

进行初始化工作(使用注解 @PostConstruct 初始化 或者 使用(xml)init-method 初始化, 前者技术比后者技术先进~);

执行初始化的后置工作;

4.使用Bean

5.销毁Bean

3.代码演示

package com.lp.bean;
 
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;
 
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
 
/**
 * @author liu pei
 * @date 2024年01月09日 下午7:36
 * @Description:
 */
@Component
public class BeanTestComponent implements BeanNameAware {
    //执行各种通知
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知"+ s);
    }
 
    //初始化的前置和后置方法不能写在这个Bean中!
 
    //执行初始化方法(注解)
    @PostConstruct
    public void postConstruct() {
        System.out.println("通过注解 @PostConstruct 执行了初始化方法");
    }
 
    //使用
    public void useBean() {
        System.out.println("使用Bean");
    }
 
    //销毁
    @PreDestroy
    public void preDestory() {
        System.out.println("执行了销毁方法");
    }
}
package com.lp.bean;
 
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
 
/**
 * @author liu pei
 * @date 2024年01月09日 下午7:34
 * @Description:
 */
@Component
public class BeanTest implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行了初始化的前置方法");
        return bean;
    }
 
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行了初始化的后置方法");
        return bean;
    }
}

4测试

package com.lp;
 
import com.lp.bean.BeanTestComponent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
 
/**
 * @author liu pei
 * @date 2023年12月05日 下午12:29
 * @Description:
 */
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer{
 
    private static final Logger logger = LoggerFactory.getLogger(DemoApplication.class);
 
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        ConfigurableEnvironment env = context.getEnvironment();
 
       
        //获取Bean
        BeanTestComponent beanTestComponent = context.getBean("beanTestComponent", BeanTestComponent.class);
        //使用Bean
        beanTestComponent.useBean();
        //销毁Bean
        beanTestComponent.preDestory();
    }
 
 
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }
}
相关文章
|
5天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
28 9
|
2天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
10天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
31 1
Spring 框架:Java 开发者的春天
|
2天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
10天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
8天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
16 5
|
10天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
24 2
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
22天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
118 2
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决