Spring Boot学习笔记(三)

LTE 中设置voice/data centric的差异 1. 什么是voice centric和data centric Voice centric和data centric的差别在于以语音为中心还是以数据为中心。这里的以某某为中心可不是说说而已。举个栗子,UE一般搜网注册都会按照LUG(LTE->UMTS->GSM)或者LC(LTE->CDMA)的顺序进行,如果UE(未开通VOLTE)注册到LTE时,网络提示不支持语音,比如CSFB。UE就必须disable LTE后回到GU或者CDMA,否则留在不能语音的网络下,UE就会... 阅读详情

Spring Boot中使用监听器

什么是 web 监听器?web 监听器是一种 Servlet 中特殊的类,它们能帮助开发者监听 web 中特定的事 件,比如ServletContext, HttpSession, ServletRequest 的创建和销毁;变量的创建、销毁和修改等。 可以在某些动作前后增加处理,实现监控。

1.Spring Boot中监听器的使用

2.1 监听Servlet上下文对象
监听 servlet 上下文对象可以用来初始化数据,用于缓存。什么意思呢?我举一个很常见的场景,比如 用户在点击某个站点的首页时,一般都会展现出首页的一些信息,而这些信息基本上或者大部分时间都 保持不变的,但是这些信息都是来自数据库。如果用户的每次点击,都要从数据库中去获取数据的话, 用户量少还可以接受,如果用户量非常大的话,这对数据库也是一笔很大的开销。
针对这种首页数据,大部分都不常更新的话,我们完全可以把它们缓存起来,每次用户点击的时候,我 们都直接从缓存中拿,这样既可以提高首页的访问速度,又可以降低服务器的压力。如果做的更加灵活 一点,可以再加个定时器,定期的来更新这个首页缓存。就类似与 优快云 个人博客首页中排名的变化一 样。
演示demo:
先写一个service,模拟数据库的查询

@Service public class UserService {

    /**     
    * 获取用户信息     
    * 
    * * @return     
    * */    
    public User getUser() {
            // 实际中会根据具体的业务场景,从数据库中查询对应的信息        
            return new User(1L, "coders", "123456");    
            } 
     }

然后写一个监听器,实现 ApplicationListener 接口,重写 onApplicationEvent 方法,将 ContextRefreshedEvent 对象传进去。如果我们想在加载或刷新应用 上下文时,也重新刷新下我们预加载的资源,就可以通过监听 ContextRefreshedEvent 来做这样的事 情。如下:

@Component 
public class MyServletContextListener implements ApplicationListener<ContextRefreshedEvent> {
 @Override    
 public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
         // 先获取到application上下文        
         ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();        
         // 获取对应的service        
         UserService userService = applicationContext.getBean(UserService.class);        
         User user = userService.getUser();        
         // 获取application域对象,将查到的信息放到application域中        
         ServletContext application = applicationContext.getBean(ServletContext.class); 
         application.setAttribute("user", user); 
              } 
  }

首先通过 contextRefreshedEvent 来获取 application 上下文,再通过 application 上下文来获取 UserService 这个 bean,项目中可以根据实际业务场景,也可以获取其他的 bean,然后再调用自己的业务代码获取相应的数据,后存储到 application 域中,这样前端在请求相 应数据的时候,我们就可以直接从 application 域中获取信息,减少数据库的压力。

测试验证:

@RestController @RequestMapping("/listener") 
public class TestController {
    @GetMapping("/user")    
    public User getUser(HttpServletRequest request) { 
           ServletContext application = request.getServletContext();        
           return (User) application.getAttribute("user");
           } 
   }

启动项目,在浏览器中输入 http://localhost:8080/listener/user 测试一下即可,正常返回 user 信息,说明数据已经缓存成功。
2.2 监听HTTP会话 Session对象
监听器还有一个比较常用的地方就是用来监听 session 对象,来获取在线用户数量,现在有很多开发者 都有自己的网站,监听 session 来获取当前在下用户数量是个很常见的使用场景。
举例:

@Component public class MyHttpSessionListener implements HttpSessionListener {
    private static final Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);
     public Integer count = 0;
    @Override    
    public synchronized void sessionCreated(HttpSessionEvent httpSessionEvent) {
            logger.info("新用户上线了");        
            count++;        
            httpSessionEvent.getSession().getServletContext().setAttribute("count", count);    
           }
    @Override    
    public synchronized void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
            logger.info("用户下线了");        
            count--;        
            httpSessionEvent.getSession().getServletContext().setAttribute("count", count);    
            } 
   }

首先该监听器需要实现 HttpSessionListener 接口,然后重写 sessionCreated 和 sessionDestroyed 方法,在sessionCreated 方法中传递一个 HttpSessionEvent 对象,然后将当 前 session 中的用户数量加1, sessionDestroyed 方法刚好相反。
测试:

@RestController 
@RequestMapping("/listener") 
public class TestController {

    /**     
    * 获取当前在线人数,该方法有bug     
    * 
    *  @param request     
    * @return     
    * */    
    @GetMapping("/total")    
    public String getTotalUser(HttpServletRequest request) {        
   		 Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");
   		 return "当前在线人数:" + count;    
      } 
}

该 Controller 中是直接获取当前 session 中的用户数量,启动服务器,在浏览器中输入 localhost:8080/listener/total 可以看到返回的结果是1,再打开一个浏览器,请求相同的地址可 以看到 count 是 2 ,这没有问题。但是如果关闭一个浏览器再打开,理论上应该还是2,但是实际测试 却是 3。原因是 session 销毁的方法没有执行(可以在后台控制台观察日志打印情况),当重新打开 时,服务器找不到用户原来的 session,于是又重新创建了一个 session,那怎么解决该问题呢?我们 可以将上面的 Controller 方法改造一下:

@GetMapping("/total2") 
public String getTotalUser(HttpServletRequest request, HttpServletResponse response) {    
		Cookie cookie;
		 try {        
		 // 把sessionId记录在浏览器中        
		 cookie = new Cookie("JSESSIONID", URLEncoder.encode(request.getSession().getId(), "utf-8"));        
		 cookie.setPath("/");        
		 //设置cookie有效期为2天,设置长一点        
		 cookie.setMaxAge( 48*60 * 60);        
		 response.addCookie(cookie);    
		 } catch (UnsupportedEncodingException e) {
		         e.printStackTrace();    
		         }    
		         Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");    
		         return "当前在线人数:" + count; 
	 }

该处理逻辑是让服务器记得原来那个 session,即把原来的 sessionId 记录在浏览器中,下 次再打开时,把这个 sessionId 传过去,这样服务器就不会重新再创建了。重启一下服务器,在浏览器 中再次测试一下,即可避免上面的问题。
2.3监听客户端请求Servlet Request对象
使用监听器获取用户的访问信息比较简单,实现ServletRequestListener 接口即可,然后通过 request 对象获取一些信息。如下:

@Component 
public class MyServletRequestListener implements ServletRequestListener {
    private static final Logger logger = LoggerFactory.getLogger(MyServletRequestListener.class);
    @Override    
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {        
    HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest(); 
           logger.info("session id为:{}", 
           request.getRequestedSessionId());        
           logger.info("request url为:{}", 
           request.getRequestURL());
           request.setAttribute("name", "coders");    }
    @Override    
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        logger.info("request end"); 
               HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
                       logger.info("request域中保存的name值为:{}", 
                       request.getAttribute("name"));
    }
}

测试:

@GetMapping("/request") 
public String getRequestInfo(HttpServletRequest request) {
    System.out.println("requestListener中的初始化的name数据:" + request.getAttribute("name"));    
    return "success"; 
 }

参考:武哥聊编程

Creo二次开发环境配置与DLL项目实战指南(Creo8.0+VS2019) 本文详细介绍了Creo8.0与VS2019环境下的二次开发配置与DLL项目实战指南,涵盖环境准备、版本匹配、DLL项目创建、核心代码编写、部署调试及常见报错处理。重点解析了Creo二次开发中的关键配置和优化技巧,帮助开发者高效解决实际问题。 阅读详情

相关推荐

Ubuntu虚拟机IP卡在127.0.0.1?别慌,试试这条万能命令 `sudo dhclient`

本文详细解析了Ubuntu虚拟机IP卡在127.0.0.1的常见原因及解决方案,重点介绍了`sudo dhclient`命令的使用方法及其变体,帮助用户快速恢复网络连接。同时提供了网络诊断工具和预防措施,适用于开发者和系统管理员应对网络故障。

weixin_29251131的博客 283

Spring Boot 中使用监听器

什么是 Web 监听器?Web 监听器是一种 Servlet 特殊类,它们能帮助开发者监听 Web 中特定的事件,比如 ServletContext、HttpSession 、ServletRequest 的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。 文章目录 12.1 Spring Boot 中监听器的使用 12.1.1 监听 Servlet 上下文对象 12.1.2 监听 HTTP 会话 Session 对象 12.1.3 监听客户端请求 Servlet Reques

攻城狮不是猫 313

Halcon VariableInspect (变量检查拓展)安装指南

网址2;

T 959

SpringBoot2.x 监听器详解

目录 1、Spring Boot 监听器类型 1.1监听 Servlet 上下文对象 1.2监听 HTTP 会话 Session 对象 1.3 监听客户端请求 Servlet Request 对象 2、Spring Boot 中自定义事件监听 2.1自定义事件 2.2自定义监听器 1、Spring Boot 监听器类型 Web 监听器的使用场景很多,比如监听 Servle...

不积跬步,无以至千里 1171

具身智能的边缘计算核心构成方案

摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠

老郑的博客 810

避开CPU瓶颈:手把手教你用RK3588的DMA-BUF实现V4L2到NPU的零拷贝数据流

本文详细介绍了如何在RK3588平台上利用DMA-BUF实现V4L2到NPU的零拷贝数据流,显著提升异构计算性能。通过实战指南展示了如何配置摄像头采集、RGA图像预处理和NPU推理优化,最终实现CPU占用率降低60%、延迟减少60%的效果,特别适合YOLOv5等AI推理应用的高效部署。

weixin_30374009的博客 571

ActionContext ServletActionContext

1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletR

huanggangmaojin的专栏 678

PyTorch转ONNX遇到算子不支持?3种实战解决方案+TensorRT适配技巧

本文针对PyTorch模型导出ONNX时常见的算子不支持问题,提供了从诊断到解决的完整实战指南。首先讲解如何精准定位错误根源,随后详细介绍了三种核心解决方案:注册缺失的符号映射、实现自定义算子,以及为TensorRT开发插件的终极落地方案。文章还分享了构建稳健部署流水线的工程化实践,帮助开发者系统性地解决模型部署中的算子兼容性挑战。

fern8的博客 842

Spring Boot实战学习笔记(三)

本文为学习Spring Boot实战的学习笔记,学习了一遍,但是好记性不如烂笔头,所以文章记录下来。图书购买地址为: https://item.jd.com/11894632.html.Spring Boot实战学习笔记1Spring Boot实战学习笔记2Spring Boot实战学习笔记3Spring Boot实战学习笔记4Spring Boot实战学习笔记51.Spring 基础2.Spri...

殘遛的博客 1004

DeepSeek + 番茄小说:AI辅助小说开发最全指南

DeepSeek与番茄小说合作推出AI辅助小说创作系统,通过DeepSeek的文本生成能力(包括情节构建、角色塑造等)结合番茄小说的市场数据,为作者提供从创意到发布的全流程支持。系统包含智能创意生成器、角色设计、章节自动生成等核心模块,采用数据驱动优化策略,支持128K长文本处理和多风格模仿。开发架构采用Python+FastAPI技术栈,提供分层审核机制确保质量。该系统可帮助作者突破创作瓶颈,提升效率,同时提供订阅制、内容分成等多元变现模式。需注意版权问题和原创性保证。

weixin_41445009的博客 1672

基于GELAN模块的YOLOv8改进-C2f结构替换与轻量化与高效涨点优化研究

本文详细探讨了在YOLOv8架构中利用YOLOv9的GELAN模块替换C2f结构的改进方法。轻量化版本在资源受限的场景中具有显著的推理效率提升,适用于边缘设备和移动端应用。高效涨点版本则在检测精度上实现了大幅突破,特别适合高精度要求的任务。实验结果显示,GELAN模块相比原C2f模块,在参数量与计算量间取得了更好的平衡,同时提升了检测性能。此外,本文还展示了结构图、训练代码和部署优化方案,为研究者和开发者提供了实践参考。

博客 1435

Spring Boot学习笔记(三)Spring Boot单元测试

Spring Boot单元测试 上一篇:简单的Spring Boot Web开发 单元测试在日常开发中是必不可少的,而Spring Boot对单元测试的支持,只需要一个注解就可以:在src – test – java 目录下建一个类:可以取名叫 WebControllerTest.java btw: 如果只需要一个Hello World,那么直接在在src – test – java 目...

Stephanie17395的博客 510

C# WPS操作PPT,全屏,缩率图,备注,跳转播放

本文介绍了一个使用C#开发的PPT操作工具,主要功能包括检测当前打开的PPT文件、获取选中PPT路径、指定播放PPT、获取PPT页面序号和缩略图、提取备注内容等。文章展示了操作界面效果图,并重点解决了用户手动退出PPT后重新获取路径时报错的问题。核心代码实现了通过WPS API进行PPT文件的打开、全屏播放、页面跳转、获取当前页位置等功能,同时支持生成PPT缩略图预览和备注信息提取。当用户未通过工具按钮打开PPT时,程序会自动初始化PPT信息确保功能正常使用。

遇见--专栏 310

Spring Boot学习笔记(三)Spring Boot日志

Spring Boot实现日志原理及使用 Spring Boot默认采用的是slf4j+logback的形式来实现日志功能的。slf4j用来做抽象层,相当与一个接口,属于日志门面;logback用来做日志的具体实现,相当于接口的实现类,属于日志实现。常见日志: 日志门面 日志实现 JCL(Jakarta Commons Logging)、SLF4j(Simple Logging F...

飞!!!的博客 448

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring Boot学习笔记【三】——使用springboot【基础】

13. 构建系统 强烈建议您选择支持依赖关系管理且可以使用发布到“Maven Central”存储库的工件的构建系统。 我们建议您选择Maven或Gradle。 可以让Spring Boot与其他构建系统(例如Ant)一起工作,但它们并没有得到特别好的支持。 13.1 Dependency Management 每个版本的Spring Boot都提供了它支持的依赖项的精选列表。 实际上,您不需要为...

茨时代べ 的博客 442

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

spring boot 学习笔记(三)之 配置

一:概述 在Spring boot 中根据业务需求,我们往往会在不同地方配置我们所需的key-value 配置项,配置文件存在不同的地方的场景如下: (1) 默认存在 application.properties 或 application.yaml ,而这些文件可以放在项目的不同地方,如:项目根目录下、项目根目录/config下、src/main/resources下、s...

weixin_30851409的博客 179

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring Boot学习笔记(三)Repository的使用

在Spring中有Repository的概念,repository原意指的是仓库,即数据仓库的意思。Repository居于业务层和数据层之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。这样设计的好处有两个: 降低层级之间的耦合:更换、升级ORM引擎(Hibernate)并不会影响业务逻辑 提高测试效率:如果在测试时能用Mock数据对象代替实际的数据库操作,运行速度会快很多 Repository和DAO的区别 DAO是传统MVC中Model的关键角色,全称是Data Access Obje

glenshappy的专栏 5408

Spring Boot学习笔记(三)——JPA篇(上)

章节索引前提JPA类级注解@Entity@Table@UniqueConstraint@Index字段级注解@Id@GeneratedValue@Column让注解发挥作用自动化生成数据库表后记 前提 这篇博文是这套Spring Boot学习笔记的第三篇——JPA篇(上),主要内容包含JPA的介绍及其各种注解的作用。如果需要了解有关Spring Boot的综述信息或博文的索引信息,请移步: 《综...

石沉溪洞 1219

Spring Boot 学习笔记(三)Spring boot 中的SSM

Spring boot 下的 Spring mvc @Controller:即为Spring mvc的注解,处理http请求; @RestController:Spring4后新增注解,是@Controller与@ResponseBody的组合注解,用于返回字符串或json数据; package com.example.springbootweb.model; public cla...

weixin_30484739的博客 100

Spring Boot 学习笔记(三)

一、脑补 SSM How2J SSM 系列教程 二、脑补 Spring 、Spring MVC 、Mybatis 基础功底是必须的 三、Spring Boot 知识点完善 还是根据How2J 教程里学习的 转载于:https://www.cnblogs.com/AardWolf/p/11175032.html...

weixin_30670925的博客 79

Spring Boot学习笔记(三)——Spring-data-jpa扩展封装

上篇文章我们分享了下Spring-data-jpa的基本使用方法,但在实际使用中可能会有更复杂的用法,现在我们来看看他的更高级玩法,并做了完美的封装,使用起来更加智能简单。Spring-data-jpa为我们提供了JpaSpecificationExecutor接口,只要简单实现toPredicate方法就可以实现复杂的查询,下面就来看看具体如何使用。首先我们来看看JpaSpecification...

我叫周伯通 7960

spring boot 学习笔记(三)

可 以看 出@RestController 注 解包 含 了 原来 的 @Controller 和@ResponseBody 注 解, 使 用 过 Spring 对 @Controller 注解用于声明当前类是控制器类,@ResponseBody 注解是将返回的数据结构转换为 Json 格式。所以在默认情况下,使用了@RestController 注解即可将返回的数据结构转换成 Json 格式,Spring Boot 中默 认使用的 Json 解析技术框架是 jackson。

Aixxn的博客 157

Shiro学习笔记(三)Spring Boot + Shiro

实际开发中必要加入缓存机制,这里使用redis作为缓存,主要使用的依赖包如下(redis): <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</ver...

JuFF_白羽的博客 314

Spring Boot 学习笔记(三)——特性

Spring Boot、启动失败监控、应用事件与监听器、web环境、访问应用参数、profile(不同环境读取不同配置)、日志配置、应用退出拦截、SpringMVC、错误处理、静态资源处理

编程点滴 652
上一篇: Spring Boot学习笔记(二)
下一篇: idea奇怪问题----点击run后没反应,按钮由绿变灰没有调起控制台
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值