1.Spring boot有哪些优点?
2.Spring Boot源码解析(四)ApplicationContext准备阶段
3.Spring Boot + EasyExcel导入导出,商城商城简直太好用了!源码源码
4.Springbootçä¼ç¹ï¼
5.全面升级!免费一套基于Spring Boot 3+JDK17的下载实战项目!
6.springboot菜鸟教程
Spring boot有哪些优点?
Spring boot的商城商城优点有简化配置、自动化配置、源码源码最新全景源码独立运行、免费快速构建项目、下载提供运行时的商城商城应用监控等。1、源码源码简化配置
Spring boot通过预定义的免费配置和自动配置简化配置过程,使开发人员能够简化配置工作。下载
2、商城商城自动化配置
Spring boot可以自动化配置,源码源码以此解决整合框架或者技术配置文件过多地问题,免费并且可以集合所有约定的默认配置。通过自动配置,Spring boot可以自动生成配置文件,并且可以方便地配置bean,避免了手动编写繁琐的配置代码。
3、独立运行
Spring boot具有独立运行的优点。Spring boot可以利用自带的依赖项对源代码进行编译和部署;此外独立于其他开发环境,Spring boot可以独立运行于其他开发环境,避免了其他开发者的依赖问题。
4、快速构建项目
Spring boot是一个快速构建项目的工具,它提供无配置的集成和开发环境,无需外部依赖;它还提供了应用监控和调试功能,极大地提高了开发效率。
5、提供运行时的应用监控
Spring boot提供了运行时的应用监控,使开发人员可以方便地监控应用程序的运行情况,并在出现问题时及时进行诊断和修复。这对于项目中的关键应用和高风险场景尤为重要。
Spring Boot源码解析(四)ApplicationContext准备阶段
深入解析Spring Boot中ApplicationContext的准备阶段,本文将带你从环境设置、后处理到初始化器的执行,直至广播事件和注册应用参数等关键步骤的全面解读。
环境的设置是准备阶段的起点,主要涉及三个步骤。github简单的源码首先,通过AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner,将包含实际参数的Environment重新配置到这些实例中,以确保ApplicationContext能够准确理解和处理后续的配置信息。
紧接着,对ApplicationContext进行后处理。这包括注册beanNameGenerator、设置resourceLoader和conversionService。对于一般配置的Spring Boot应用,这些部分往往为空,因此主要执行的是设置conversionService,确保数据转换的顺利进行。
处理Initializer阶段,Spring Boot通过遍历META-INF/spring.factories中的initializer加载配置,执行8个预设的Initializer方法,它们负责执行特定的功能,例如增强或定制ApplicationContext行为,尽管具体实现细节未详细展开。
广播ApplicationContextInitialized和BootstrapContextClosed事件,以及注册applicationArguments和printedBanner,是准备阶段的后续操作,确保ApplicationContext能够接收外部参数并展示启动信息,同时为ApplicationContext的后续操作做准备。
在设置不支持循环引用和覆盖后,调整lazy initialization为默认不允许。Spring Boot通过配置确保依赖注入过程的高效性和稳定性,同时提供了开启懒加载的选项,允许在实际使用时加载bean,提高应用启动性能。
最后,处理重排属性的post processor,确保ConfigurationClassPostProcessor加载的property在正确的位置被处理,维护配置加载的逻辑顺序和依赖关系。
资源的加载是准备阶段的最后一步,将PrimarySource与所有其他源整合到allSources中,并返回一个不可修改的集合。这个过程确保了资源的高效访问和管理,为ApplicationContext的后续操作提供基础。
在完成启动类的加载后,Spring Boot通过构建BeanDefinitionLoader并配置相应的网站页面源码设置组件,将主类Application加载到Context中。这一过程是动态且高效的,确保了应用的快速启动和资源的有效管理。
至此,Spring Boot中ApplicationContext的准备阶段全面解析完成,从环境设置到启动类加载,每一个步骤都为ApplicationContext的高效运行打下了坚实的基础。接下来,我们将探讨ApplicationContext的刷新过程,敬请关注。
Spring Boot + EasyExcel导入导出,简直太好用了!
老项目主要采用的POI框架来进行Excel数据的导入和导出,但经常会出现OOM的情况,导致整个服务不可用。后续逐步转移到EasyExcel,简直不能太好用了。
EasyExcel是阿里巴巴开源插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。主要解决方式:通过解压文件的方式加载,一行一行地加载,并且抛弃样式字体等不重要的数据,降低内存的占用。
在之前专门写过一篇文章《EasyExcel太方便易用了,强烈推荐!》,介绍EasyExcel功能的基本使用。今天这篇文章,我们基于SpringBoot来实现一下EasyExcel的集成,更加方便大家在实践中的直接使用。
创建一个基础的SpringBoot项目,比如这里采用SpringBoot 2.7.2版本。
EasyExcel在SpringBoot的集成非常方便,只需引入对应的pom依赖即可。在上述dependencies中添加EasyExcel的依赖:
EasyExcel目前稳定最新版本2.2.。如果想查看开源项目或最新版本,可在GitHub上获得:github.com/alibaba/easy...
为了方便和简化代码编写,音频滤波源码这里同时引入了Lombok的依赖,后续代码中也会使用对应的注解。
下面正式开始业务相关代码的编写。如果你想直接获得完整源码,对照源码阅读本篇文章,可在公号「程序新视界」内回“”获得完整源码。
这里创建一个Member,会员的实体类,并在实体类中填写基础的个人信息。
为了尽量多的演示EasyExcel的相关功能,在上述实体类中使用了其常见的一些注解:
GenderConverter转换器的代码实现如下:
不同版本中,convertToJavaData和convertToExcelData的方法参数有所不同,对应的值的获取方式也不同,大家在使用时注意对照自己的版本即可。
为方便验证功能,DAO层的逻辑便不再实现,直接通过Service层来封装数据,先来看导出功能的业务类实现。
定义MemberService接口:
定义MemberServiceImpl实现类:
其中数据采用模拟的静态数据,返回Member列表。
在Controller层的实现一个简单的导出实现:
这个实现方式非常简单直接,使用EasyExcel的write方法将查询到的数据进行处理,以流的形式写出即可。
在浏览器访问对应的链接,可下载到如下Excel内容:
如果我们需要将导出的Excel进行一些格式化的处理,这就需要用到导出策略的实现了。
在EasyExcel执行write方法之后,获得ExcelWriterBuilder类,通过该类的registerWriteHandler方法可以设置一些处理策略。
这里先实现一个通用的格式策略工具类CommonCellStyleStrategy:
该类中示例设置了Excel的基础格式。
再来实现一个精细化控制单元格内容CellWriteHandler的实现类:
在这里,对单元格表头的第0个Cell设置了一个超链接。
通过上面的定义两个策略实现,在导出Excel可以使用上述两个策略实现:
通过浏览器,访问上述接口,导出的Excel格式如下:
可以看出,导出的Excel已经附带了具体的格式。其中表头“用户名”上也携带了对应的超链接。其他更精细化的控制,大家可以在策略类中做进一步的淘宝开源码店控制。
所谓的同步获取结果导入,就是执行导入操作时,将导入内容解析封装成一个结果列表返回给业务,业务代码再对列表中的数据进行集中的处理。
先来看同步导入的实现方式。
注意,在上述代码中,最终调用的是doReadSync()方法。
这里直接用PostMan进行相应的文件上传请求:
执行导入请求,会发现控制台打印出对应的解析对象:
说明上传成功,并且解析成功。
上面示例中是基于同步获取结果列表的形式进行导入,还有一种实现方式是基于监听器的形式来实现。这种形式可以达到边解析边处理业务逻辑的效果。
定义Listener:
在MemberExcelListener中可以针对每条数据进行对应的业务逻辑处理。
对外接口实现如下:
这里采用了doRead()方法进行读取操作。在PostMan中再次上传Excel,打印日志如下:
说明解析成功,并且在解析的过程中,进行了业务逻辑的处理。
本篇文章基于SpringBoot集成EasyExcel的实现展开,为大家讲解了EasyExcel在实践中的具体运用。大家可根据需要,进行变通处理。同时,基于自定义转换器、自定义策略、自定义监听器等形式达到灵活适用于各种场景。希望本篇文章能给大家带来帮助。
博主简介:《SpringBoot技术内幕》技术图书作者,酷爱钻研技术,写技术干货文章。 公众号:「程序新视界」,博主的公众号,欢迎关注~ 技术交流:请联系博主微信号:zhuan2quan
Springbootçä¼ç¹ï¼
Springbootç®ä»
1ãSpringBootå¯ä»¥è½»æ¾å建ç¬ç«çãç产级çåºäºSpringçåºç¨ç¨åºï¼æ¨å¯ä»¥âç´æ¥è¿è¡âè¿äºåºç¨ç¨åºãæ们对Springå¹³å°å第ä¸æ¹åºéåäºåºæ§çè§ç¹ï¼å æ¤æ¨å¯ä»¥è½»æ¾ä¸æã
2ãSpringBootæ¯ä¸ä¸ªåºäºSpringçå¿«éå¼åæ¡æ¶ï¼å®éè¿âæ人æ´åå âï¼starterï¼å°Spring常ç¨çjarå å å«å¨å ï¼è§£å³Springä¾èµç¹å¤é®é¢ãéè¿åä¸é ç½®æ件ï¼è§£å³äºä¼ ç»é¡¹ç®ç¹å¤ãå¤æçé ç½®ã
3ãSpringBootçåµå ¥å¼ApacheTomcatæå¡å¨å å½Webæå¡å¨ï¼å¹¶æ£å¨ä¾¦å¬localhostportä¸ç请æ±ã
4ãspringboot帮æ们åç两件äºï¼ä¸ä¸ªæ¯éè¿starterå¼å ¥æ们éè¦çæ¡æ¶ï¼starterè´è´£å¼å ¥èªå·±çä¾èµï¼å¦ä¸ä¸ªæ¯éè¿autoconfigureçæä¸äºé»è®¤çé ç½®ï¼ç®åæ们ç使ç¨ï¼è¿ä¸æ¥æ¯éè¿spring.factoriesä¸å®ä¹çé 置类å®ç°çã
5ãSpringBootå¯ä»¥è½»æ¾å建å¯ä»¥âç´æ¥è¿è¡âçç¬ç«çãç产级çåºäºSpringçåºç¨ç¨åºãæ们对Springå¹³å°å第ä¸æ¹ä¿æåºæ§å·±è§ççæ³ï¼å æ¤æ¨å¯ä»¥è½»æ¾ä¸æã大å¤æ°SpringBootåºç¨ç¨åºéè¦æå°çæ¶é´Springé ç½®ã
6ãSpringBootå åå©ç¨äºJavaConfigçé 置模å¼ä»¥åâ约å®ä¼äºé ç½®âçç念ï¼è½å¤æ大çç®ååºäºSpringMVCçWebåºç¨åRESTæå¡å¼åã
jspåspringbootåªä¸ªç®åjavawebåspringbootï¼springbootæ´ç®åã
SpringBootçå¼åæ¡æ¶æ´å ç®åï¼èNode.jsçå¦ä¹ å¿ é¡»è¦äºè§£JavaScriptï¼å æ¤ç¸å¯¹æ¥è¯´SpringBootæ´ç®åä¸äºã
jspæ¬è´¨ä¸æ¯servlet容å¨.Springæ¯JavaEEç¼ç¨é¢åçä¸ä¸ªè½»é级å¼æºæ¡æ¶ï¼å®æ¯ä¸ºäºè§£å³ä¼ä¸åºç¨å¼åçå¤ææ§èå建çãSpring使ç¨åºæ¬çJavaBeanæ¥å®æSpringæ¯ä¸ä¸ªè½»é级çæ§å¶å转(IoC)åé¢ååé¢(AOP)ç容å¨æ¡æ¶ã
springbootä¸ssmçä¼ç¹
äºè 主è¦åºå«æ¯ï¼SpringBootæä¾æå ¶å¿«éåç®åçæä½ï¼è®©Springå¼åè å¿«éä¸æãSpringBootæä¾äºSpringè¿è¡çé»è®¤é ç½®ã
å¨å¼åä¸çåºå«è¿æ¯åå¨çï¼è½ç¶springbootç®åäºé ç½®ï¼ä½å¹¶ä¸ä»£è¡¨ä¸éè¦ç¼åé ç½®æ件ï¼è¿æ¯éè¦å¨èªå¸¦çapplication.ymlæ件ä¸å»ç¼åä¸äºå 容ï¼åªä¸è¿ç¼åçæ¹å¼åå¾ç®åäºï¼è½ç¶ç®åäºï¼ä½æ¯åSSMæ´åçæ¹å¼è¿æäºåºå«ã
æ£å 为ä¸è¿°çä¼ç¹ï¼Springbootå¯ä»¥é常容æåå¿«éå°å建åºäºSpringæ¡æ¶çåºç¨ç¨åºï¼ä½¿å¾ç¼ç ãé ç½®ãé¨ç½²åçæ§é½åå¾ç®åäºï¼å æ¤å®å¨ä¸çå¤åå ³æ³¨ã
SSMï¼Spring+SpringMVC+MyBatisï¼æ¡æ¶éç±SpringãMyBatis两个å¼æºæ¡æ¶æ´åèæï¼SpringMVCæ¯Springä¸çé¨åå 容ï¼ã常ä½ä¸ºæ°æ®æºè¾ç®åçweb项ç®çæ¡æ¶ã
å ³äºspringboot常è§é¢è¯é¢æ´çç¬è®°ä¸è¬æä¸ç§ï¼å°springbootæå åå°å®¹å¨ä¸ï¼ä¹å¯ç´æ¥è¿è¡main主æ¹æ³ï¼ä¹å¯ä»¥mavernæ件è¿è¡ã
éè¿è¿ç§æ¹å¼ï¼SpringBootè´åäºå¨è¬ååå±çå¿«éåºç¨å¼åé¢å(rapidapplicationdevelopment)æ为é¢å¯¼è ã
SpringBootæ¯è§£å³è¿ä¸ªé®é¢çæ¹æ³SpringBootå·²ç»å»ºç«å¨ç°æspringæ¡æ¶ä¹ä¸ä½¿ç¨springå¯å¨ï¼æ们é¿å äºä¹åæä»¬å¿ é¡»åçæææ ·æ¿ä»£ç åé ç½®ãå æ¤ï¼Spring帮å©æ们以æå°çå·¥ä½éï¼æ´å å¥å£®å°ä½¿ç¨ç°æçSpringåè½ã
å¨SpringBootå¯å¨å¨ä¸æ·»å 注解ï¼å¼å¯åºäºæ³¨è§£çRabbitMQ模å¼ãdockerä¸å®è£ è¿è¡Elasticsearchæå¡ï¼éå¶å å大å°MBï¼é»è®¤ä¸º2Gï¼ã
ä¸ä¸ªæ¡æ¶çæºç ä¹æ¯æ大çç¥è¯åºï¼æºç æ¯ä¸å±ä¸å±åµå¥çï¼å é æå说æä¼æ¯è¾é¾ä»¥ç解ï¼æ好æ¯å¨IDEç¯å¢ä¸è·çä¸æ¥ä¸æ¥è·çç¹ä¸å»ã
springbootæ¡æ¶çä¼ç¹æ ¸å¿çiocãaopææ¯åioc解è¦ä½¿å¾ä»£ç éç¨æ§åå¯ç»´æ¤æ§å¤§å¤§æé«ãaopæä¾äºå沿çç¼ç¨ï¼è¿ä¹æé«äºç产çã2)springmvcï¼ç¸æ¯struts2çmvcæ¡æ¶ï¼ä¸æstruts2æé£ä¹å¤å®å ¨æ¼æ´ï¼å°±æ¯ç±»æ¦æªã
å®å¯ä»¥çå»ä¹åç¹ççç¼è¾é ç½®æ件çè¿ç¨ï¼éç¨å¤§éçé»è®¤é ç½®æ¥ç®åå¼åè¿ç¨ã
ä½ææ¬é«æçãspringbootåvueå¯ä»¥å®ç°æ¨¡ååãç»ä»¶åãå¯ææçåå端å离æ¶æææ·å¼åæ¡æ¶ï¼å¯ç¨äºå¿«éæ建åå端å离åå°ç®¡çç³»ç»ï¼å®ç°ç®åå¼åãæåå¼åæççç»æµæ¹é¢çç®çã
Springbootæ¯springçå项ç®ï¼ç§°ä¸ºä¸ç«å¼è§£å³æ¹æ¡ï¼éæäºå¤é¨å¾å¤çä¼ç§çæ¡æ¶ï¼å¦å¸¸ç¨çmysqlãjdbcã
ä½æ¯éè¿ä½¿ç¨SpringJDBC模åçJDBCTemplateï¼æ们å¯ä»¥å°å®ç®å为åªéå 个ç®åé ç½®æè å è¡ä»£ç ãSpringBootçä»ç»SpringBootåºæ¬ä¸æ¯Springæ¡æ¶çæ©å±ï¼å®æ¶é¤äºè®¾ç½®Springåºç¨ç¨åºæéçå¤æä¾è¡é ç½®ã
全面升级!一套基于Spring Boot 3+JDK的实战项目!
最近将mall项目升级为基于Spring Boot 3+JDK的版本,本文将详细介绍此次升级的主要内容。升级包括依赖更新、框架用法调整以及运行部署的改动。目前,Spring Boot 3版本的代码位于mall项目dev-v3分支下,希望能为各位开发人员提供参考。
mall项目是一套基于SpringBoot、Vue和uni-app构建的电商系统,拥有GitHub上K星标,支持前后台商城与管理系统,涵盖商品、订单、购物车、权限、优惠券、会员和支付等全面功能。
为了升级至Spring Boot 3,项目依赖已更新至最新主流版本,具体版本信息请参照相关文档。升级过程中,部分框架用法有所调整,如API文档生成库由SpringFox升级为SpringDoc,Spring Data Elasticsearch和Spring Security的使用方式也有所变化。
从SpringFox迁移到SpringDoc,以适应Spring Boot 3的需求。Spring Data Elasticsearch的查询方式保持不变,但对于复杂查询,ElasticsearchRestTemplate已被移除,需要使用ElasticsearchTemplate类进行实现。Spring Security的配置也转向函数式编程方式,以适应新版Spring Boot的特性。
在Windows环境下运行项目时,需确保JDK版本为,操作与以往版本基本相同。对于Linux环境,打包应用的Docker镜像需配置使用openjdk:,通过修改项目根目录下的pom.xml中的docker-maven-plugin插件配置即可完成。此外,在打包镜像前,应提前下载openjdk镜像,使用相应命令执行。
总结升级要点,强调Spring Boot 3版本的代码位于dev-v3分支中。项目源码地址已提供,以供参考和进一步探索。
springboot菜鸟教程
Spring Boot菜鸟教程 一、Spring Boot简介 Spring Boot是一个开源的Java框架,旨在简化Spring应用的开发和部署。它集成了许多默认的开发和生产环境配置,允许开发者快速构建基于Spring的应用。Spring Boot提供了自动配置、快速开发和部署的特性,使得创建微服务变得简单。 二、Spring Boot核心特性 1. 自动配置:Spring Boot根据项目的依赖关系自动配置应用。 2. 嵌入式服务器:默认支持多种嵌入式服务器,如Tomcat、Jetty等,无需单独部署。 3. 简化开发:提供了一组快速开发的功能,如安全、数据访问等。 4. 微服务支持:非常适合构建微服务架构的应用。 三、Spring Boot项目创建 1. 使用Spring Initializr创建项目骨架。Spring Initializr是一个Web工具,可以快速生成Spring Boot项目的基础结构。通过选择需要的模块和依赖,下载生成的项目结构,解压后即可使用。 2. 使用集成开发环境创建项目。许多主流的IDE都支持创建Spring Boot项目,如IntelliJ IDEA和Eclipse。使用IDE创建项目可以简化配置和项目管理。 四、Spring Boot项目结构 一个典型的Spring Boot项目结构包括以下几个部分: 1. src/main/java:存放Java源代码。 2. src/main/resources:存放配置文件和资源文件。 3. pom.xml或build.gradle:项目的构建配置文件,用于管理依赖和插件。 4. 入口类:通常是带有@SpringBootApplication注解的类,作为应用的启动点。 五、构建第一个Spring Boot应用 创建一个简单的REST API应用,通过Spring Boot实现基本的CRUD操作。涉及的主要步骤包括:创建项目、添加依赖、编写业务逻辑代码、配置数据库连接等。可以通过阅读官方文档或在线教程逐步学习如何实现这些步骤。 六、部署和测试 完成应用开发后,可以使用Spring Boot的内置工具进行部署和测试。例如,使用mvn spring-boot:run命令运行应用,或使用自动化测试框架进行集成测试。部署方面,可以将应用打包成Docker镜像或使用外部服务器进行部署。测试是保证应用质量的重要环节,应编写单元测试和集成测试以确保功能的正确性。SpringBoot源码 | refreshContext方法解析
本文主要解析SpringBoot启动流程中的`refreshContext`方法。在SpringBoot启动过程中,主要涉及两个阶段:初始化`SpringApplication`对象和`SpringApplication.run`方法执行的内容。`refreshContext`方法的执行,标志着启动流程的深入。
`refreshContext`方法的主要功能是刷新容器,其源码揭示了这一过程的关键步骤。首先,方法通过调用`refresh`来实现底层`ApplicationContext`的刷新。`ApplicationContext`接口的抽象实现类`AbstractApplicationContext`,通过模板方法设计模式,要求具体子类实现抽象方法,以适应不同的配置存储需求。
`refresh`方法执行了一系列操作,包括准备刷新上下文、调用上下文注册为bean的工厂处理器、初始化上下文的消息源、初始化特定上下文子类中的其他特殊bean、检查监听器bean并注册,以及发布相应的事件并销毁已经创建的单例及重置active标志。
在`refresh`方法内部,`prepareRefresh`方法负责准备上下文以进行刷新,包括设置启动日期和活动标志,以及执行属性源的初始化。`obtainFreshBeanFactory`方法获取新的bean工厂,通过`refreshBeanFactory`方法进行配置,以及`getBeanFactory`方法返回当前上下文的内部bean工厂。
`prepareBeanFactory`方法配置工厂标准的上下文特征,如上下文类加载器、后置处理器等。`postProcessBeanFactory`方法进一步处理bean工厂,根据WebApplicationType选择特定的操作,如添加后置处理器以及注册特定的web作用域。
`invokeBeanFactoryPostProcessors`方法调用bean工厂的后置处理器,`registerBeanPostProcessors`方法实例化并注册所有后置处理器bean。`initMessageSource`方法初始化应用上下文消息源,而`initApplicationEventMulticaster`方法则为上下文初始化事件多播。
`onRefresh`方法执行刷新操作,`createWebServer`方法创建web服务,`registerListeners`方法检查并注册监听器。`finishBeanFactoryInitialization`方法实例化所有剩余的单例bean,而`finishRefresh`方法发布事件,重置Spring核心中的公共内省缓存,标志着容器刷新的结束。
`resetCommonCaches`方法重置Spring核心中的公共内省缓存,`contextRefresh.end`方法容器刷新结束,最终执行日志打印,完成启动流程。
总的来说,`refreshContext`方法的执行流程清晰,通过丰富的源码注释,便于学习者深入理解SpringBoot启动机制。本文仅提供方法解析的概览,更多细节请参考原始源码。
毕设/私活/兼职大佬必备,一个挣钱的开源springboot脚手架
本文推荐一个集SpringBoot、MyBatis、Shiro于一体的开源项目,旨在帮助您快速搭建系统,节省开发时间,特别适合学习技术、接私活、完成毕设或兼职挣钱。该项目功能丰富,使用简单,让开发者能更专注于业务逻辑,而无需过多关注基础架构。
项目特点包括内置功能模板,方便快捷,根据实际需求,您可以选择添加或删除模块。项目启动简单,改造后的版本更加贴合实际应用,删除了不必要的功能,简化了界面。
核心技术为SpringBoot框架,提供简洁、轻量级的项目配置,易于上手。SpringBoot2.x版本要求JDK 8及以上,服务器使用Tomcat 8及以上版本。Spring Boot简化了开发流程,易于与Spring Cloud集成,加快应用开发速度。
安全控制方面,Spring Security提供了认证、授权、安全防护等功能,易于集成,且社区资源丰富。与Shiro相比,Spring Security功能更为全面,但配置和使用相对复杂。
此开源项目适用于快速开发,代码质量较高,适合个人学习和项目实践。建议收藏,获取源码后,您可按照项目文档和示例进行学习和开发。
2024-11-30 06:25
2024-11-30 06:22
2024-11-30 06:22
2024-11-30 06:15
2024-11-30 05:54
2024-11-30 05:38
2024-11-30 04:49
2024-11-30 04:32