关于SpringBean的个人学习总结

简介: Spring Bean 是由 Spring 容器管理的对象实例,通过配置元数据创建和装配,实现对象的集中管理和解耦。Bean 可通过构造方法、工厂等方式实例化,具备完整生命周期,支持初始化与销毁回调,提升应用的可维护性与灵活性。

Spring Bean 是什么

Bean 定义本质上是创建一个或多个对象的配方。容器在请求时查看有名称的Bean的配方,并使用该Bean定义所封装的配置元数据来创建(或获取)一个实际对象。

在 Spring 框架中,Bean 是指被 Spring 容器管理或者实例化的对象。Bean 可以是任何一个由 Java 实例,例如数据库连接、业务逻辑类、控制器等等。Spring Bean 实例的创建和管理是由 Spring 容器负责的,而不是应用程序本身。

Bean 给我们带来的优势主要是将对象的创建和管理和业务逻辑分离开,主打一个低耦合,让程序本身更易于维护和管理,比如在我们的项目中,连接数据库的创建和管理只需要交给 Spring 容器就行,业务逻辑在 Service层完成,当需要连接另一个数据库,只需要修改 Spring 的配置文件即可。

Bean 的作用范围

为什么Bean默认为单例?

  • 为了提高性能

适合交给容器进行管理的bean

  • 表现层对象
  • 业务层对象
  • 数据层对象
  • 工具对象

不适合交给容器进行管理的bean

  • 封装实体的域对象

实例化 Bean 的方式

构造方法

提供可使用的构造方法

public class BookServiceImpl implements BookService {
   
    public BookServiceImpl() {
   
        System.out.println(" book constructor...");
    }

    @Override
    public void schedule() {
   
        System.out.println("预定了一本书...");
    }
}

如果代码中只有无参构造的话,比如上面代码,那么里面的无参构造可以省略,Spring 会使用默认的无参构造,但是如果有带参构造的话,那就要显式写出无参构造

xml配置

<bean id="bookService" class="com.springbean.service.impl.BookServiceImpl"/>

如果不提供无参构造方法的话,就会抛出异常:

Caused by: java.lang.NoSuchMethodException: com.springbean.service.impl.BookServiceImpl.<init>()

实例工厂

使用FactoryBean实例化 bean

xml 配置

需要先配置一个工厂 bean

<bean id="bookFactory" class="com.springbean.appFroInstance.BookFacBean"/>

FactoryBean 实例

public class BookFac implements FactoryBean<BookService> {
   

    @Override
    public BookService getObject() throws Exception {
   
        return new BookServiceImpl();
    }

    @Override
    public Class<?> getObjectType() {
   
        return BookService.class;
    }

    @Override
    public boolean isSingleton() {
   
        return FactoryBean.super.isSingleton();
    }
}

静态工厂

xml 配置

<bean id="bookFactory" class="com.springbean.factory.StaticBookFactory" factory-method="getBookSchedule"/>

静态方法

public class StaticBookFactory {
   
    public static BookService getBookSchedule(){
   
        return new BookServiceImpl();
    }
}

Bean 的生命周期

演示链接

概念

bean 的生命周期

简单来说就是,bean从创建到销毁的整体过程

bean 的生命周期控制

bean创建后到销毁前做一些事情

生命周期过程

简要版

初始化容器

  1. 创建对象(内存分配)
  2. 执行构造方法
  3. 执行属性注入(set)
  4. 执行bean初始化方法

使用bean

  1. 执行业务操作

关闭 / 销毁容器

  1. 执行bean销毁方法

img

详细版

  • 实例化:Spring 容器根据配置文件或注解实例化对象
  • 属性注入:Spring 将依赖(通过 setter 或者字段注入)注入到 Bean 实例中
  • 初始化前的扩展机制:如果 Bean 实现了BeanNameAware等 aware 接口,则执行 aware 注入
  • 初始化前(BeanPostProcessor):在 Bean 初始化前,可以通过 BeanPostProcessor 接口对 Bean 进行一些额外的处理
  • 初始化:调用InitializingBean接口的afterPropertiesSet()方法或通过init-method属性指定的方法
  • 初始化后(BeanPostProcessor):在 Bean 初始化后,可以通过BeanPostProcessor进行进一步处理
  • 使用Bean:Bean 已经初始化完成,可以被容器中的其他 Bean 使用
  • 销毁:当容器关闭时,Spring 调用 DisposableBean 接口的destroy()或者通过destroy-method属性指定的销毁方法。

img

代码模拟

没添加set方法(属性注入)

1)xml 配置

<bean id="bookDao" class="com.springbean.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>

2)业务逻辑代码

编写接口代码:

public interface BookDao {
   
    void save();

    void init();

    void destroy();
}

实现类:

public class BookDaoImpl implements BookDao {
   
    @Override
    public void save() {
   
        System.out.println("book dao save...");
    }

    @Override
    public void init() {
   
        System.out.println("init...");
    }

    @Override
    public void destroy() {
   
        System.out.println("destroy...");
    }
}

3)测试代码:

public class BookMain {
   
    public static void main(String[] args) {
   
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        applicationContext.registerShutdownHook();
        BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");

        bookDao.save();

//        applicationContext.close();
    }
}

registerShutdownHookSpring框架中ConfigurableApplicationContext接口的一个方法,用于注册一个JVM关闭钩子

作用:在JVM关闭的时候,确保Spring容器可以优雅关闭,并执行所有单例bean的销毁回调方法

工作原理

  1. 注册钩子:向 JVM 注册一个关闭钩子线程
  2. JVM 关闭时触发:当 JVM 收到关闭信号(如 Ctrl+C、系统关闭等)时,会调用这个钩子
  3. 关闭 Spring 容器:钩子线程会调用 ApplicationContextclose() 方法
  4. 执行销毁回调:Spring 会调用所有单例 bean 的销毁方法(如 @PreDestroyDisposableBean 接口、destroy-method 等)

在虚拟机退出前先关闭容器再退出虚拟机

4)执行结果:

init...
book dao save...
destroy...

添加set

在业务逻辑中添加set方法的bean初始化容器的顺序变化

1)先看执行结果的变化

# 创建对象
init...  
# 执行构造方法
service constructor...
# 执行属性注入
service set ...
# 执行 bean 初始化方法
service init...
# 执行业务操作
预定了一本书...
book dao save...
# 关闭销毁容器
service destroy...
destroy...

2)添加set之后的xml配置

<bean id="bookService" class="com.springbean.service.impl.BookServiceImpl">
  <property name="bookDao" ref="bookDao"/>
</bean>

3)业务逻辑代码

实现InitializingBean, DisposableBean接口

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
   

    private BookDao bookDao;

    public BookServiceImpl() {
   
        System.out.println("service constructor...");
    }

    @Override
    public void schedule() {
   
        System.out.println("预定了一本书...");
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
   
        System.out.println("service set ...");
        this.bookDao = bookDao;
    }

    public void destroy() throws Exception{
   
        System.out.println("service destroy...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
   
        System.out.println("service init...");
    }
}

afterPropertiesSet:初始化回调

源码解释:

由包含的BeanFactory在设置所有bean属性并满足BeanFactoryAwareApplicationContextAware等条件后调用。该方法允许bean实例在已设置所有bean属性时对其整体配置和最终初始化进行验证。

抛出异常: 在出现配置错误(例如未能设置一个必要属性)或由于其他任何原因初始化失败的情况下

4)测试函数代码:

public class BookMain {
   
    public static void main(String[] args) {
   
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        applicationContext.registerShutdownHook();

        BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");
        BookService bookService = (BookService) applicationContext.getBean("bookService");
        bookService.schedule();

    }
}
相关文章
|
24天前
|
缓存 前端开发 API
登录校验---Filter过滤器
Filter是JavaWeb三大组件之一,用于拦截请求并实现登录校验、编码处理等功能。通过`doFilter()`方法实现过滤逻辑,支持配置拦截路径与过滤器链。常用于JWT令牌验证、跨域处理等场景。
310 10
登录校验---Filter过滤器
|
4天前
|
人工智能 缓存 安全
LangChain v1.0 中间件详解:彻底搞定 AI Agent 上下文控制
LangChain v1.0 引入中间件机制,系统化解决上下文管理难题。通过模块化中间件,实现输入预处理、敏感信息过滤、工具权限控制等,提升Agent在生产环境的稳定性与可维护性。
175 5
LangChain v1.0 中间件详解:彻底搞定 AI Agent 上下文控制
|
6天前
|
存储 安全 数据库
一文搞懂 AES 加密:现代对称加密的黄金标准
AES是全球最广泛使用的对称加密算法,高效安全,广泛应用于HTTPS、移动应用、数据库等场景。本文带你了解其原理、Python实现及与RSA的协同使用,掌握数据保护核心技术。#AES #数据加密 #信息安全
219 7
|
15天前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
242 29
|
27天前
|
人工智能 安全 Java
分布式 Multi Agent 安全高可用探索与实践
在人工智能加速发展的今天,AI Agent 正在成为推动“人工智能+”战略落地的核心引擎。无论是技术趋势还是政策导向,都预示着一场深刻的变革正在发生。如果你也在探索 Agent 的应用场景,欢迎关注 AgentScope 项目,或尝试使用阿里云 MSE + Higress + Nacos 构建属于你的 AI 原生应用。一起,走进智能体的新世界。
340 32
|
5天前
|
机器学习/深度学习 人工智能 Rust
茶叶的病害与健康状态图像数据集(10,000 张图片已划分)| AI训练适用于目标检测任务
本数据集包含10,000张标注茶叶图像,覆盖8类常见病害与健康状态,适用于目标检测、图像分类等AI任务。已划分训练、验证与测试集,支持YOLO等主流框架,助力智慧农业与病害智能诊断研究。
126 37
茶叶的病害与健康状态图像数据集(10,000 张图片已划分)| AI训练适用于目标检测任务
|
10天前
|
关系型数据库 MySQL 数据处理
基于python的化妆品销售分析系统
本项目基于Python构建化妆品销售分析系统,结合Django框架与MySQL数据库,实现销售数据的采集、处理、分析与可视化,助力企业精准营销与决策优化,推动化妆品行业数字化转型。
|
5天前
|
机器学习/深度学习 人工智能 监控
翻墙、攀爬、跨越围栏等违规行为检测数据集(10,000 张图片已划分)—安全检测实践
本数据集包含10,000张标注图片,专注翻墙、攀爬等违规行为检测,适用于YOLOv8模型训练。涵盖工地、校园等多种场景,支持智能安防、视频分析等应用,助力构建高效安全监控系统。
翻墙、攀爬、跨越围栏等违规行为检测数据集(10,000 张图片已划分)—安全检测实践
|
1月前
|
安全 物联网 API
Windows 11 25H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 9 月发布)
Windows 11 25H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 9 月发布)
949 15
Windows 11 25H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 9 月发布)
|
30天前
|
小程序 搜索推荐 前端开发
基于微信小程序的旅游景点推荐系统
本研究聚焦旅游信息化发展,针对游客获取信息难、体验差等问题,设计基于微信小程序的景点推荐系统。结合uni-app与MySQL技术,实现跨平台、高效率的旅游信息服务,提升用户体验与管理效能,推动旅游业数字化升级。