作为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());
    }
}
相关文章
|
29天前
|
XML 安全 Java
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
85 2
|
6天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
6天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
30天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
54 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
12天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
49 6
|
13天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
72 3
|
27天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
32 1
|
2月前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
49 0