什么是 Spring 的组件(Bean)

news2025/1/3 22:24:02

什么是 Spring 的组件(Bean)?

Spring 会自动创建、初始化、装配和销毁这些对象。Spring 使用 IoC(控制反转)DI(依赖注入) 的理念,将应用程序的对象交给 Spring 容器统一管理,这些对象就被称为 Bean

Bean 的定义
  • Spring Bean 是 Spring 容器中的一个实例化对象。
  • Bean 的生命周期由 Spring 管理,包括创建、依赖注入、初始化、销毁等过程。
  • Bean 通常由以下方式定义:
    • 使用 配置类XML 配置文件 手动定义。
    • 使用注解(如 @Component@Service)自动扫描和注册。

简单来说,Spring Bean 就是 Spring 应用程序中的核心组件,它们是构建业务逻辑和服务的基础。


Java 中常见的组件

Java 中组件是指可以被复用的模块化代码单元,通常以类的形式存在。Spring 框架通过组件扫描自动管理这些组件。根据用途,Java 中常见的组件可以划分为以下几类:

1. 服务类组件

服务类组件是实现具体业务逻辑的类,通常标记为 Spring 的 @Service

示例:

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public String getUserInfo() {
        return "User Info";
    }
}

特性:

  • 定义业务逻辑。
  • 通常与 DAO 层(数据访问层)协作。

2. 控制器组件

控制器是 MVC 模式中的一部分,负责处理用户请求并返回相应结果,通常标记为 @Controller@RestController

示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @GetMapping("/user")
    public String getUser() {
        return "User Info";
    }
}

特性:

  • 接收 HTTP 请求并将其映射到具体的业务逻辑。
  • 如果需要返回 JSON 或 XML 数据,可以使用 @RestController

3. 数据访问层组件

数据访问层组件用于与数据库交互,通常标记为 @Repository

示例:

import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {
    public String findUserById(int id) {
        return "User " + id;
    }
}

特性:

  • 负责数据的持久化和访问。
  • 提供与数据库交互的方法(如 CRUD 操作)。
  • Spring 提供了异常转换功能,将数据库相关的异常(如 SQLException)转化为 Spring 的数据访问异常。

4. 通用组件

通用组件是指那些不直接属于服务、控制器或 DAO 层的类,但对整个应用程序有辅助功能,例如工具类或自定义逻辑,通常标记为 @Component

示例:

import org.springframework.stereotype.Component;

@Component
public class Utility {
    public String format(String input) {
        return input.trim().toUpperCase();
    }
}

特性:

  • 通常是无状态的工具类。
  • 可被任意层的其他组件注入和使用。

5. 配置类组件

配置类用于定义 Spring 容器中的 Bean,通常标记为 @Configuration

示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public String appName() {
        return "My Spring Application";
    }
}

特性:

  • 提供一种编程式的方式定义 Bean(代替 XML 配置文件)。
  • 通常用于配置数据库连接池、消息队列等第三方资源。

6. 切面类组件

切面类是面向切面编程(AOP)的核心,用于实现横切关注点,例如日志记录、权限校验等,通常标记为 @Aspect

示例:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore() {
        System.out.println("方法执行前记录日志");
    }
}

特性:

  • 与目标方法分离,避免在业务逻辑中编写重复代码。
  • 用于日志记录、性能监控、事务管理等场景。

7. 消息监听器组件

消息监听器用于监听消息队列(如 Kafka、RabbitMQ)中的消息,通常与消息中间件集成。

示例:

import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class MessageListener {
    @KafkaListener(topics = "my-topic", groupId = "my-group")
    public void listen(String message) {
        System.out.println("Received message: " + message);
    }
}

特性:

  • 用于处理异步消息。
  • 常见中间件:RabbitMQ、Kafka、ActiveMQ 等。

8. 自定义注解组件

开发者可以基于 @Component 自定义注解,用于标记特定类型的组件。

示例:

import org.springframework.stereotype.Component;

@Component
public @interface CustomComponent {
    String value() default "";
}

使用自定义注解:

@CustomComponent("customBean")
public class MyCustomBean {
    public void doSomething() {
        System.out.println("自定义组件工作中...");
    }
}

Spring 常见组件和作用总结

注解作用
@Component标记通用组件类,Spring 会将其作为 Bean 管理。
@Service标记业务逻辑类,表示服务层组件。
@Repository标记数据访问层类,表示 DAO 层组件,提供异常转换功能。
@Controller标记控制器类,用于处理 HTTP 请求(MVC 模式)。
@RestController标记控制器类,返回 JSON 或 XML 数据,适用于 RESTful API。
@Configuration标记配置类,用于定义 Spring 容器中的 Bean。
@Aspect定义切面类,用于封装横切逻辑,例如日志记录或事务管理。
@ComponentScan指定扫描范围,告诉 Spring 在哪些包中寻找 @Component 等注解标记的类。

Bean 的生命周期

Spring 管理的 Bean 的生命周期如下:

  1. 实例化:Spring 容器根据配置或注解创建 Bean 实例。
  2. 依赖注入:Spring 容器为 Bean 注入依赖。
  3. 初始化:如果 Bean 实现了 InitializingBean 接口或定义了初始化方法(如 @PostConstruct),Spring 会在创建完成后调用初始化方法。
  4. 使用:Bean 被应用程序逻辑使用。
  5. 销毁:当容器关闭时,如果 Bean 实现了 DisposableBean 接口或定义了销毁方法(如 @PreDestroy),Spring 会调用销毁方法。

总结

  • 组件(Bean) 是 Spring 应用程序的核心对象,由 Spring 容器管理。
  • Spring 提供了多种注解(如 @Component@Service@Repository 等)来简化组件的定义和分类。
  • 常见的组件包括服务类、控制器、DAO、工具类、配置类和切面类等。
  • 通过组件化开发,可以显著提高代码的复用性、可维护性和可读性,是 Spring 框架的重要设计理念之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。 编译源码…

flask后端开发(3):html模板渲染

目录 渲染模板html模板获取路由参数 gitcode地址: https://gitcode.com/qq_43920838/flask_project.git 渲染模板 这样就能够通过html文件来渲染前端,而不是通过return了 html模板获取路由参数

SOME/IP 协议详解——序列化

文章目录 0. 概述1.基本数据序列化2.字符串序列化2.1 字符串通用规则2.2 固定长度字符串规则2.3 动态长度字符串规则 3.结构体序列化4. 带有标识符和可选成员的结构化数据类型5. 数组5.1 固定长度数组5.2 动态长度数组5.3 Enumeration(枚举)5.4 Bitfield…

HTML5实现好看的喜庆圣诞节网站源码

HTML5实现好看的喜庆圣诞节网站源码 前言一、设计来源1.1 主界面1.2 圣诞介绍界面1.3 圣诞象征界面1.4 圣诞活动界面1.5 圣诞热度界面1.6 圣诞纪念界面1.7 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的喜庆圣诞节网站源码,圣…

嵌入式开发中的机器人表情绘制

机器人的表情有两种,一种是贴图,一钟是调用图形API自绘。 贴图效果相对比较好,在存储空间大的情况下是可以采用的。 自绘比较麻烦,但在资源和空缺少的情况下,也是很有用的。而且自绘很容易通过调整参数加入随机效果&…

opencv实现KNN算法识别图片数字

KNN算法实现识别图片数字 目录 KNN算法实现识别图片数字图片基本情况图片数据 图片数字识别图片数据处理及预测其它数字图片正确率预测 图片基本情况 图片 数据 图片像素是2000x1000,即高(行)1000,宽(列)2000&#xf…

美畅物联丨视频上云网关获取视频流地址供第三方调用的方法

在视频监控与流媒体传输领域,视频流地址的获取与调用是极为关键的环节。视频上云网关作为一款高效且稳定的视频传输设备,为获取视频流地址提供了便捷途径,从而使外部系统或平台能够方便地进行调用。今天我们就来讨论一下如何在视频上云网关上…

MySQL数据库——索引结构之B+树

本文先介绍数据结构中树的演化过程,之后介绍为什么MySQL数据库选择了B树作为索引结构。 文章目录 树的演化为什么其他树结构不行?为什么不使用二叉查找树(BST)?为什么不使用平衡二叉树(AVL树)&a…

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…

Fetch处理大模型流式数据请求与解析

为什么有的大模型可以一次返回多个 data? Server-Sent Events (SSE):允许服务器连续发送多个 data: 行,每个代表一个独立的数据块。 流式响应:大模型服务通常以流式响应方式返回数据,提高响应速度。 批量处理&#x…

期权懂|个股期权的流动性如何?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权的流动性如何? 个股期权作为场外交易工具,具有较高的灵活性。场外交易意味着交易双方可以直接协商交易条款,这有助于满足不同投资者的…

国产低代码框架zdppy开发笔记002 标准的接口响应

前言 通过前面的学习, 我们已经知道了zdppy_api和zdppy_req的基本用法, 接下来我们会在学习中多次用到这两个框架. 我们已经知道了该如何响应一个字符串,但是我们该如何响应json数据呢? 在zdppy_api中,我们定义了一组规范的API响应, 我们慢慢来看看. 规范的响应 首先来看…

Linux | 零基础Ubuntu解压RaR等压缩包文件

目录 介绍 案例分析 安装工具 解压实践 介绍 RAR是一种专利文件格式,用于数据压缩与归档打包,开发者为尤金罗谢尔(俄语:Евгений Лазаревич Рошал,拉丁转写:Yevgeny Lazarevich R…

Python基于卷积神经网络的车牌识别系统开发与实现

1. 简介 车牌识别是人工智能在交通领域的重要应用,广泛用于高速违章检测、停车场管理和智能交通系统等场景。本系统通过基于卷积神经网络(CNN)的深度学习算法,结合 Python 和 MySQL 实现车牌的快速识别与管理。 系统特点&#x…

stm32内部flash在线读写操作

stm32内部flash在线读写操作 📍相关开源库文章介绍《STM32 利用FlashDB库实现在线扇区数据管理不丢失》 ✨不同系列,内部flash编程有所区别。例如stm32f1是按照页擦除,半字(16bit)或全字(32bit)数据写入;st…

IDEA | SpringBoot 项目中使用 Apifox 上传接口

目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南: https://apifox.com/help/applications-and-p…

Leetcode 10-正则表达式匹配/ 剑指 Offer 19. 正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。 题解 字符串匹配多…

学习vue3的笔记

一、vue和react的对比 1、基础介绍 vue:https://cn.vuejs.org/ vue3是2020年创建的 react:https://react.dev/ react是一个2013年开源的JavaScript库,严格意义上来说不是一个框架 2、diff算法 两个框架采用的都是同级对比策略 两节点对…

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展,环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…

【MySQL】搞懂mvcc、read view:MySQL事务原理深度剖析

前言:本节内容是事务里面最难的一部分, 就是理解mvcc快照读和read view。这两个部分需要了解隔离性里面的四种隔离级别。 博主之前讲过,但是担心友友们不了解, 所以这里开头进行了复习。 下面开始我们的学习吧! ps&…