当前位置: 首页 > news >正文

springboot常用的20个注解

Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成,

而Spring Boot 之所以能够轻松地实现应的创建及与其他框架快速集成,最核心的原因就在于它极大地简化了项目的配置,最大化地实现了“约定大于配置”的原则,然而基于Spring Boot 虽然极大地方便了开发,但是也很容易让人“云里雾里”,特别是各种注解很容易让人“知其然而不知其所以然”。

所以,要想用好Spring Boot 就必须对其提供的各类功能注解有一个全面而清晰地认识和理解。一方面可以提高基于Spring Boot 的开发效率,另外一方面也是面试中被问及框架原理时所必须掌握的知识点

Spring 相关6个注解
Spring Boot 的有些注解也需要与 Spring 的注解搭配使用,这里 怀玉 梳理了在项目中与 Spring Boot 注解配合最为紧密的 6 个 Spring 基础框架的注解。如:

1、@Configuration
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@Configuration
public class TaskAutoConfiguration {@Bean@Profile("biz-electrfence-controller")public BizElectrfenceControllerJob bizElectrfenceControllerJob() {return new BizElectrfenceControllerJob();}@Bean@Profile("biz-consume-1-datasync")public BizBikeElectrFenceTradeSyncJob bizBikeElectrFenceTradeSyncJob() {return new BizBikeElectrFenceTradeSyncJob();}
}

2、@ComponentScan
做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

@ComponentScan(value = "com.abacus.check.api")
public class CheckApiApplication {public static void main(String[] args) {SpringApplication.run(CheckApiApplication.class, args);}
}

@SpringBootApplication注解也包含了@ComponentScan注解,所以在使用中我们也可以通过@SpringBootApplication注解的scanBasePackages属性进行配置。

@SpringBootApplication(scanBasePackages = {"com.abacus.check.api", "com.abacus.check.service"})
public class CheckApiApplication {public static void main(String[] args) {SpringApplication.run(CheckApiApplication.class, args);}
}

3、@Conditional
@Conditional是Spring4新提供的注解,通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件。Spring Boot注解中的@ConditionalOnProperty、@ConditionalOnBean等以@Conditional*开头的注解,都是通过集成了@Conditional来实现相应功能的。

4、@Import
通过导入的方式实现把实例加入springIOC容器中。可以在需要时将没有被Spring容器管理的类导入至Spring容器中。

//类定义
public class Square {}public class Circular {}//导入
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig{}

5、@ImportResource
和@Import类似,区别就是@ImportResource导入的是配置文件。

@ImportResource(“classpath:spring-redis.xml”) //导入xml配置

public class CheckApiApplication {public static void main(String[] args) {SpringApplication.run(CheckApiApplication.class, args);}
}

6、@Component
@Component是一个元注解,意思是可以注解其他类注解,如@Controller @Service @Repository。带此注解的类被看作组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化。其他类级别的注解也可以被认定为是一种特殊类型的组件,比如@Controller 控制器(注入服务)、@Service服务(注入dao)、@Repository dao(实现dao访问)。@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,作用就相当于 XML配置。

Spring Boot 最核心的20个注解
说完与Spring Boot密切相关的几个Spring基础注解后,下面我们就再一起看看Spring Boot提供的核心注解的内容吧!

1、@SpringBootApplication
这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。

@SpringBootApplication(exclude = {MongoAutoConfiguration.class,MongoDataAutoConfiguration.class,DataSourceAutoConfiguration.class,ValidationAutoConfiguration.class,MybatisAutoConfiguration.class,MailSenderAutoConfiguration.class,
})
public class API {public static void main(String[] args) {SpringApplication.run(API.class, args);}
}

2、@EnableAutoConfiguration
允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。

@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
去重,并将exclude和excludeName属性携带的类排除;
过滤,将满足条件(@Conditional)的自动配置类返回;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage

//导入AutoConfigurationImportSelector的子类

@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}

3、@SpringBootConfiguration
这个注解就是 @Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展

4、@ConditionalOnBean
@ConditionalOnBean(A.class)仅仅在当前上下文中存在A对象时,才会实例化一个Bean,也就是说只有当A.class 在spring的applicationContext中存在时,这个当前的bean才能够创建。

@Bean
//当前环境上下文存在DefaultMQProducer实例时,才能创建RocketMQProducerLifecycle这个Bean

@ConditionalOnBean(DefaultMQProducer.class)
public RocketMQProducerLifecycle rocketMQLifecycle() {return new RocketMQProducerLifecycle();
}

5、@ConditionalOnMissingBean
组合@Conditional注解,和@ConditionalOnBean注解相反,仅仅在当前上下文中不存在A对象时,才会实例化一个Bean

  @Bean//仅当当前环境上下文缺失RocketMQProducer对象时,才允许创建RocketMQProducer Bean对象@ConditionalOnMissingBean(RocketMQProducer.class)public RocketMQProducer mqProducer() {return new RocketMQProducer();}

6、@ConditionalOnClass
组合 @Conditional 注解,可以仅当某些类存在于classpath上时候才创建某个Bean。

  @Bean//当classpath中存在类HealthIndicator时,才创建HealthIndicator Bean对象@ConditionalOnClass(HealthIndicator.class)public HealthIndicator rocketMQProducerHealthIndicator(Map<String, DefaultMQProducer> producers) {if (producers.size() == 1) {return new RocketMQProducerHealthIndicator(producers.values().iterator().next());}}

7、@ConditionalOnMissingClass
组合@Conditional注解,和@ConditionalOnMissingClass注解相反,当classpath中没有指定的 Class才开启配置。

8、@ConditionalOnWebApplication
组合@Conditional 注解,当前项目类型是 WEB 项目才开启配置。当前项目有以下 3 种类型:ANY(任何Web项目都匹配)、SERVLET(仅但基础的Servelet项目才会匹配)、REACTIVE(只有基于响应的web应用程序才匹配)。

9、@ConditionalOnNotWebApplication
组合@Conditional注解,和@ConditionalOnWebApplication 注解相反,当前项目类型不是 WEB 项目才开启配置。

10、@ConditionalOnProperty
组合 @Conditional 注解,当指定的属性有指定的值时才开启配置。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。

@Bean//匹配属性rocketmq.producer.enabled值是否为true@ConditionalOnProperty(value = "rocketmq.producer.enabled", havingValue = "true", matchIfMissing = true)public RocketMQProducer mqProducer() {return new RocketMQProducer();}

11、@ConditionalOnExpression
组合 @Conditional 注解,当 SpEL 表达式为 true 时才开启配置。

@Configuration
@ConditionalOnExpression("${enabled:false}")
public class BigpipeConfiguration {@Beanpublic OrderMessageMonitor orderMessageMonitor(ConfigContext configContext) {return new OrderMessageMonitor(configContext);}
}

12、@ConditionalOnJava
组合@Conditional 注解,当运行的 Java JVM 在指定的版本范围时才开启配置。

13、@ConditionalOnResource
组合 @Conditional 注解,当类路径下有指定的资源才开启配置。

@Bean
@ConditionalOnResource(resources="classpath:shiro.ini")
protected Realm iniClasspathRealm(){return new Realm();
}

14、@ConditionalOnJndi
组合 @Conditional 注解,当指定的 JNDI 存在时才开启配置。

15、@ConditionalOnCloudPlatform
组合 @Conditional 注解,当指定的云平台激活时才开启配置。

16、@ConditionalOnSingleCandidate
组合 @Conditional 注解,当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。

17、@ConfigurationProperties
Spring Boot可使用注解的方式将自定义的properties文件映射到实体bean中,比如config.properties文件。

@Data
@ConfigurationProperties("rocketmq.consumer")
public class RocketMQConsumerProperties extends RocketMQProperties {private boolean enabled = true;private String consumerGroup;private MessageModel messageModel = MessageModel.CLUSTERING;private ConsumeFromWhere consumeFromWhere = ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET;private int consumeThreadMin = 20;private int consumeThreadMax = 64;private int consumeConcurrentlyMaxSpan = 2000;private int pullThresholdForQueue = 1000;private int pullInterval = 0;private int consumeMessageBatchMaxSize = 1;private int pullBatchSize = 32;
}

18、@EnableConfigurationProperties
当@EnableConfigurationProperties注解应用到你的@Configuration时,任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。 这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。

@Configuration
@EnableConfigurationProperties({RocketMQProducerProperties.class,RocketMQConsumerProperties.class,
})
@AutoConfigureOrder
public class RocketMQAutoConfiguration {@Value("${spring.application.name}")private String applicationName;
}

19、@AutoConfigureAfter
用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。

如 Mybatis 的自动配置类,需要在数据源自动配置类之后。

@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}

20、@AutoConfigureBefore
这个和@AutoConfigureAfter注解使用相反,表示该自动配置类需要在另外指定的自动配置类配置之前。

21、@AutoConfigureOrder
Spring Boot 1.3.0中有一个新的注解@AutoConfigureOrder,用于确定配置加载的优先级顺序。

  @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自动配置里面的最高优先级@Configuration@ConditionalOnWebApplication // 仅限于web应用@Import(BeanPostProcessorsRegistrar.class) // 导入内置容器的设置public class EmbeddedServletContainerAutoConfiguration {@Configuration@ConditionalOnClass({ Servlet.class, Tomcat.class })@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)public static class EmbeddedTomcat {// ...}@Configuration@ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)public static class EmbeddedJetty {// ...}
}

相关文章:

springboot常用的20个注解

Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架&#xff0c;它不仅可以方便地创建生产级的Spring应用程序&#xff0c;还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成&#xff0c; 而Spring Boot 之所以能够轻松地实现应的创建及与…...

USB组合设备——带鼠标功能的键盘

文章目录带鼠标功能的键盘一个接口实现报告描述符示例多个接口实现复合设备和组合设备配置描述符集合的实现报告的返回附 STM32 枚举日志复合设备&#xff1a;Compound Device 内嵌 Hub 和多个 Function&#xff0c;每个 Function 都相当于一个独立的 USB 外设&#xff0c;有自…...

数据结构与算法基础-学习-18-哈夫曼编码

一、个人理解在远程通讯中&#xff0c;需要把字符转成二进制的字符串进行传输&#xff0c;例如我们需要传输ABCD&#xff0c;我们可以用定长的字符串进行表示&#xff0c;例如:A:00B:01C:02D:03这样可能就造成空间的浪费&#xff0c;我们多存储了一个0号位。那用变长呢&#xf…...

ZMC408CE | 实现“8通道独立PSO”应用场景

一、ZMC408SCAN产品亮点 1.高性能处理器&#xff0c;提升运算速度、响应时间和扫描周期等&#xff1b; 2.一维/二维/三维、多通道视觉飞拍&#xff0c;高速高精&#xff1b; 3.位置同步输出PSO&#xff0c;连续轨迹加工中对精密点胶胶量控制和激光能量控制等&#xff1b; 4…...

QuickJS中JS_SetClassProto方法把JavaScript对象指定为某个类的原型对象

在 QuickJS 中&#xff0c;JS_SetClassProto 方法用于设置一个类的原型对象。这个方法的作用是将一个 JavaScript 对象指定为该类的原型对象&#xff0c;从而定义该类的属性和方法。 具体来说&#xff0c;JS_SetClassProto 方法的第一个参数是指向 QuickJS 引擎执行上下文的指…...

泰克信号发生器特点

泰克信号发生器是一种用于产生各种类型的电子信号的仪器&#xff0c;可以广泛应用于电子、通信、自动化、医疗等领域。泰克信号发生器具有以下特点&#xff1a;多种信号类型&#xff1a;泰克信号发生器可以产生多种类型的电子信号&#xff0c;包括正弦波、方波、三角波、脉冲等…...

贯穿设计模式第四话--里氏替换原则

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 从今天开始&#xff0c;将…...

6501: 鸡兔同笼

描述 一个笼子里面关了鸡和免子(鸡有两只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物&#xff0c;至多有多少只动物。 输入 一个正整数a(a<32768)。 输出 包含两个正整数&#xff0c;第一个是最少的动物数&#xff0c;第二个是最多的…...

Linux项目自动化构建工具-make/makefile 介绍及使用

使用背景 在工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义一系列 规则来指定什么文件需要先编译&#xff0c;什么文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;或者更复杂 的功能操作 makefile带来的好处…...

【云原生|Docker】06-dokcerfile详解

目录 前言 Dockerfile基础示例 Dockerfile简介 1. Dockerfile概念 2. Dokcer镜像分层理解 ​3. Doker build构建原理 Dockerfile参数解析 1. Dokcerfile组成 2. 指令说明 2.1 FROM引入基础镜像 2.2 LABEL 2.3 ENV 2.4 RUN 2.5 COPY 2.6 ADD 2…...

【SCL】博图——先入先出排序法

使用博图SCL语言来实现先入先出排序 前言 使用SCL完成一个先入先出排序 具体要求&#xff1a;最先输入的一个数值&#xff0c;最先输出出来&#xff0c;下面的数自动向前填充&#xff1b; 注&#xff1a;这里可能有两种理解&#xff1a;一是第一个输入的第一个出来&#xff…...

OSPF----特殊区域

目录 OSPF----特殊区域 第一大类----末梢区域&#xff08;Stub Area&#xff09; 完全末梢区域&#xff08;(Totally Stub Area) 第二大类特殊区域----非完全末梢区域&#xff08;NSSA&#xff09; OSPF----特殊区域 第一大类----末梢区域&#xff08;Stub Area&#xff09…...

JVM-类加载

1&#xff1a;类加载机制&#xff1a; 加、验、准、解、初、使、卸 加、烟、准、姐、初、湿、鞋 加载、将class 文件转化为二进制流加载 JVM 内存中并生成一个该类的Class对象验证、Class 文件的字节流中包含的信息是否符合当前虚拟机的要求准备、在方法区中分配这些变量所…...

超详细讲解C语言文件操作!!

超详细讲解C语言文件操作&#xff01;&#xff01;什么是文件文件名文件的打开和关闭文件指针文件的打开和关闭文件的顺序读写文件的随机读写fseekftellrewind文本文件和二进制文件文件读取结束的判定文件缓冲区什么是文件 磁盘上的文件是文件。但是在程序设计中&#xff0c;我…...

linxu学习之进程

文章目录进程程序和进程产生进程销毁进程多进程高并发设计孤儿僵尸守护进程孤儿进程&#xff1a;守护进程(重点)僵尸进程&#xff1a;进程 程序和进程 操作系统可以运行多个程序&#xff0c;那他是如何运行的&#xff1f;实际上&#xff0c;CPU的执行是很快的&#xff0c;而待…...

蓝桥杯真题2

[蓝桥杯 2013 省 B] 连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题&#xff1a; 在 111 ~ NNN 的某个全排列中有多少个连号区间呢&#xff1f;这里所说的连号区间的定义是&#xff1a; 如果区间 [L,R][L, R][L,R] 里的所有元素&#xff08;即此排列的…...

PWM互补输出,以及死区时间计算

本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波&#xff0c;且进行死区时间的计算说明。 代码 互补输出对应的定时器初始化代码&#xff1a; bsp_advance_tim.c /********************************************************************************* fi…...

基于深度学习的海洋动物检测系统(Python+YOLOv5+清新界面)

摘要&#xff1a;基于深度学习的海洋动物检测系统使用深度学习技术检测常见海洋动物&#xff0c;识别图片、视频和实时视频中的海洋动物&#xff0c;方便记录、展示和保存结果。本文详细介绍海洋动物检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码…...

C# 计算方差

50&#xff0c;100&#xff0c;100&#xff0c;60&#xff0c;50 计算他们的方差 为了计算这些数的方差&#xff0c;需要进行以下步骤&#xff1a; 1. 计算平均值&#xff0c;即将这些数相加&#xff0c;然后除以它们的数量。 平均值 (50 100 100 60 50) / 5 72 2. 计…...

HJZS电源监视继电器HJZS-E202 AC220V

系列型号&#xff1a; HJZS-E202断电延时继电器 HJZS-E002断电延时继电器 一 应用 HJZS-E202电源监视继电器用于直流或交流操作的各种保护和自动控制的装置中&#xff0c;用以增加触点数量。 二 安装结构 导轨安装9壳体结构&#xff0c;具体尺寸参阅外型尺寸图。 三 产品型号…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...