×

基于SpringBoot的新闻管理系统【附源码】

前端技术网 前端技术网 发表于2024-02-03 16:37:16 浏览3262 评论0

抢沙发发表评论

一、SpringBoot内置生命周期事件详解 SpringBoot源码(十)

SpringBoot中文注释项目Github地址:

https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE

基于SpringBoot的新闻管理系统【附源码】

本篇接 SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)

温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了 SpringBoot启动时广播生命周期事件的原理,现将关键步骤再浓缩总结下:

上篇文章的侧重点是分析了SpringBoot启动时广播生命周期事件的原理,此篇文章我们再来详细分析SpringBoot内置的7种生命周期事件的源码。

分析SpringBoot的生命周期事件,我们先来看一张类结构图:

由上图可以看到事件类之间的关系:

EventObject类是JDK的事件基类,可以说是所有Java事件类的基本,即所有的Java事件类都直接或间接继承于该类,源码如下:

基于SpringBoot的新闻管理系统【附源码】

可以看到 EventObject类只有一个属性 source,这个属性是用来记录最初事件是发生在哪个类,举个栗子,比如在SpringBoot启动过程中会发射 ApplicationStartingEvent事件,而这个事件最初是在 SpringApplication类中发射的,因此 source就是 SpringApplication对象。

ApplicationEvent继承了DK的事件基类 EventObject类,是Spring的事件基类,被所有Spring的具体事件类继承,源码如下:

可以看到 ApplicationEvent有且仅有一个属性 timestamp,该属性是用来记录事件发生的时间。

SpringApplicationEvent类继承了Spring的事件基类 ApplicationEvent,是所有SpringBoot内置生命周期事件的父类,源码如下:

可以看到 SpringApplicationEvent有且仅有一个属性 args,该属性就是SpringBoot启动时的命令行参数即标注@SpringBootApplication启动类中 main函数的参数。

接下来我们再来看一下 SpringBoot内置生命周期事件即 SpringApplicationEvent的具体子类们。

SpringBoot开始启动时便会发布 ApplicationStartingEvent事件,其发布时机在环境变量Environment或容器ApplicationContext创建前但在注册 ApplicationListener具体监听器之后,标志标志 SpringApplication开始启动。

可以看到 ApplicationEnvironmentPreparedEvent事件多了一个 environment属性,我们不妨想一下,多了 environment属性的作用是啥?

答案就是 ApplicationEnvironmentPreparedEvent事件的 environment属性作用是利用事件发布订阅机制,相应监听器们可以从 ApplicationEnvironmentPreparedEvent事件中取出 environment变量,然后我们可以为 environment属性增加属性值或读出 environment变量中的值。

当SpringApplication已经开始启动且环境变量 Environment已经创建后,并且为环境变量 Environment配置了命令行和 Servlet等类型的环境变量后,此时会发布 ApplicationEnvironmentPreparedEvent事件。

监听 ApplicationEnvironmentPreparedEvent事件的第一个监听器是 ConfigFileApplicationListener,因为是 ConfigFileApplicationListener监听器还要为环境变量 Environment增加 application.properties配置文件中的环境变量;此后还有一些也是监听 ApplicationEnvironmentPreparedEvent事件的其他监听器监听到此事件时,此时可以说环境变量 Environment几乎已经完全准备好了。

可以看到 ApplicationContextInitializedEvent事件多了个 ConfigurableApplicationContext类型的 context属性, context属性的作用同样是为了相应监听器可以拿到这个 context属性执行一些逻辑,具体作用将在 3.4.4详述。

ApplicationContextInitializedEvent事件在 ApplicationContext容器创建后,且为 ApplicationContext容器设置了 environment变量和执行了 ApplicationContextInitializers的初始化方法后但在bean定义加载前触发,标志ApplicationContext已经初始化完毕。

同样可以看到 ApplicationPreparedEvent事件多了个 ConfigurableApplicationContext类型的 context属性,多了 context属性的作用是能让监听该事件的监听器们能拿到 context属性,监听器拿到 context属性一般有如下作用:

ApplicationPreparedEvent事件在 ApplicationContext容器已经完全准备好时但在容器刷新前触发,在这个阶段 bean定义已经加载完毕还有 environment已经准备好可以用了。

ApplicationStartedEvent事件将在容器刷新后但 ApplicationRunner和 CommandLineRunner的 run方法执行前触发,标志 Spring容器已经刷新,此时容器已经准备完毕了。

ApplicationReadyEvent事件在调用完 ApplicationRunner和 CommandLineRunner的 run方法后触发,此时标志 SpringApplication已经正在运行。

可以看到 ApplicationFailedEvent事件除了多了一个 context属性外,还多了一个 Throwable类型的 exception属性用来记录SpringBoot启动失败时的异常。

ApplicationFailedEvent事件在SpringBoot启动失败时触发,标志SpringBoot启动失败。

此篇文章相对简单,对SpringBoot内置的7种生命周期事件进行了详细分析。我们还是引用上篇文章的一张图来回顾一下这些生命周期事件及其用途:

由于有一些小伙伴们建议之前有些源码分析文章太长,导致耐心不够,看不下去,因此,之后的源码分析文章如果太长的话,笔者将会考虑拆分为几篇文章,这样就比较短小了,比较容易看完,嘿嘿。

【源码笔记】Github地址:

https://github.com/yuanmabiji/Java-SourceCode-Blogs

点赞搞起来,嘿嘿嘿!

公众号【源码笔记】专注于Java后端系列框架的源码分析。

二、Springboot下的RabbitMQ消息监听源码解读

以上配置比较简单,都是一些基本的配置,配置Rabbit的连接工厂,配置Template,客户端操作的模版RabbitTemplate对象。

注解核心配置

主要注册一个BeanPostProcessor和RabbitListenerEndpointRegistry创建消息监听容器管理生命周期。

RabbitBootstrapConfiguration.java

在上一步将所有的方法(方法上有@RabbitListener注解的)解析处理后,接下来开始处理消息监听

接着上面构建完MethodRabbitListenerEndpoint对象后,将所有的监听方法保存

到此消息监听@RabbitListener注解的方法就处理完成了,所有的监听方法都保存到了RabbitListenerAnnotationBeanPostProcessor.registrar.endpointDescriptors**中。

RabbitListenerAnnotationBeanPostProcessor处理器程序实现了SmartInitializingSingleton接口,所以在所有的Bean创建完成以后会执行Bean实现了SmartInitializingSingleton#afterSingletonsInstantiated的方法。

注册监听程序

注册监听容器

监听容器工厂父类创建监听容器

到此消息监听容器MessageListenerContainer(SimpleMessageListenerContainer)对象创建完成,

到这里主要的消息监听容器都创建完成后接下来就是启动消息监听容器了。

在2.2中注册了RabbitListenerEndpointRegistry对象,该类实现了SmartLifecycle接口,也实现了ApplicationListener接口,并且处理的是ContextRefreshedEvent事件。

上面这两个动作都会在容器上下文初始化完成以后触发,在AbstractApplicationContext#refresh#finishRefresh方法中触发

开始消息监听

异步消息处理消费者AsyncMessageProcessingConsumer

事件处理

RabbitAutoConfiguration===》RabbitAnnotationDrivenConfiguration===》EnableRabbitConfiguration===》@EnableRabbit

注册RabbitListenerAnnotationBeanPostProcessor处理器处理@RabbitListener和@RabbitHandler注解

RabbitListenerAnnotationBeanPostProcessor类

将上一步解析出来的所有方法及对应的@RabbitListener注解中配置的信息进行包装到MethodRabbitListenerEndpoint中

说明:@RabbitListener注解中的errorHandler属性可以是SpEL表达式也可以是一个Bean的名称

该步骤中主要就是设置相关的一些属性信息到Endpoint中,比如:ackMode,queueName,concurrency等信息。

构造完Endpoint对象后将其保存到RabbitListenerEndpointRegistrar中。

RabbitListenerAnnotationBeanPostProcessor类实现了SmartInitializingSingleton接口,当所有的Bean初始化完成以后会执行实现了SmartInitializingSingleton接口Bean的回调方法afterSingletonsInstantiated。

在afterSingletonsInstantiated方法中调用RabbitListenerAnnotationBeanPostProcessor.registrar(RabbitListenerEndpointRegistrar)#afterPropertiesSet

方法。

在afterPropertiesSet方法中就是注册Endpoint了,在该方法中将所有的Endpoint再封装成MessageListenerContainer(SimpleMessageListenerContainer)

对象,最后将MessageListenerContainer对象保存到RabbitListenerEndpointRegistry.listenerContainers的Map**中。

在这里是还没有启动所有的监听程序。

RabbitListenerEndpointRegistry对象Bean实现了SmartLifecycle接口,所以容器上下文执行完(刷新完)以后会调用实现了该接口的会滴方法start,启动消息监听。

SpringBoot多数据源配置详解

SpringBoot邮件发送示例

Springboot面试题整理附答案

SpringBoot配置文件你了解多少?

SpringBoot项目查看线上日志

springboot mybatis jpa实现读写分离

Springboot整合openfeign使用详解

SpringBoot RabbitMQ消息可靠发送与接收

Springboot整合MyBatis复杂查询应用

Springboot整合RabbitMQ死信队列详解

三、SpringBoot微人事管理系统前后端分离附源码

项目介绍:

此项目是由 Spring Boot+ Vue前后端分离技术开发,共同学习前后端分离开发项目,共同学习

后端技术:

前端技术

系统部署

由于我在 vuehr项目中已经配置了端口转发,将数据转发到 Spring Boot上,因此项目启动之后,在浏览器中输入 http://localhost:8080就可以访问我们的前端项目了,所有的请求通过端口转发将数据传到 Spring Boot中(注意此时不要关闭 Spring Boot项目)。

该命令执行成功之后,vuehr目录下生成一个 dist文件夹,将该文件夹中的两个文件 static和 index.html拷贝到 Spring Boot项目中 resources/static/目录下,然后就可以像第 6步那样直接访问了

感谢您花时间阅读本文!我们希望通过对基于SpringBoot的新闻管理系统【附源码】的问题进行探讨,为您提供了一些有用的见解和解决方案。如果您需要更多帮助或者有其他疑问,请不要犹豫与我们联系。