springboot 监听,springboot配置自定义监听器

  springboot 监听,springboot配置自定义监听器

  00-1010 1.听众2。2中监听器的使用。SpringBoot 2.1监听Servlet上下文对象2.2监听HTTP会话会话对象摘要

  

目录

web Listener是Servlet中的一个特殊类,可以帮助开发者监控web中的特定事件,比如ServletContext、HttpSession、ServletRequest的创建和销毁。变量的创建、销毁和修改等。可以在一些动作前后添加处理,实现监控。

 

  

1.监听器

web listener的使用场景有很多,比如监听servlet上下文初始化一些数据,监听http会话获取当前在线人数,监听客户端请求的servletrequest对象获取用户的访问信息。

 

  00-1010监听Servlet上下文对象可用于初始化数据以进行缓存。比如用户点击一个网站的主页,主页上一般会显示一些信息,这些信息基本上或者大部分时间保持不变,但是所有的信息都来自数据库。如果用户每次点击都必须从数据库中获取数据,那么少量用户是可以接受的。如果用户数量非常大,也会对数据库造成很大的开销。

  对于这类首页数据,如果大部分不经常更新,我们完全可以缓存。用户每点击一次,我们就直接从缓存中取,这样既能提高主页的访问速度,又能减轻服务器的压力。如果做的比较灵活,可以加一个定时器,定期更新这个首页缓存,就像csdn个人博客首页排名的变化一样。

  让我们为这个函数编写一个服务,并模拟从数据库中查询数据:

  包com . example . spring demo 1 . service;导入com . example . spring demo 1 . POJO . user;导入org . spring framework . stereotype . service;@ service public class user service 2 { public user getuser(){//实际操作中,根据具体的业务场景,会从数据库中查询到相应的信息return new user (10, lyh10 , 123456 );}}然后编写一个监听器,实现ApplicationListener接口,重写onApplicationEvent方法,传入ContextRefresheEvent对象。如果我们希望在加载或刷新应用程序上下文时刷新预加载的资源,我们可以通过侦听ContextRefresheEvent来实现这一点,如下所示:

  包com . example . spring demo 1 . util;导入com . example . spring demo 1 . POJO . user;导入com . example . spring demo 1 . service . user service 2;导入org . spring framework . context . application context;导入org . spring framework . context . application listener;import org . spring framework . context . event . contextrefreshedevent;导入org . spring framework . stereotype.component;导入javax . servlet . servlet context;@Componentpublic类MyServletContextListener实现ApplicationListenerContextRefreshedEvent { @ Override public void on application Event(context tr ErefreshEvent context refresh Event){//获取应用程序上下文application context=context refresh事件。GetApplicationContext()优先;//获取对应的serviceuserservice 2 user service 2=application context . getbean(user service 2 . class);user user=user service 2 . getuser();//获取应用程序域对象,将找到的信息放入应用程序域的ServletContext app中。

  lication = applicationContext.getBean(ServletContext.class); application.setAttribute("user",user); }}首先通过contextRefreshedEvent来获取application上下文,再通过application上下文来获取UserService这个bean,然后再调用自己的业务代码获取相应的数据,最后存储到application域中,这样前端在请求相应数据的时候,我们就可以直接从application域中获取信息,减少数据库的压力,下面写一个controller直接从application域中获取user信息来测试一下

  

package com.example.springdemo1.controller;import com.example.springdemo1.pojo.User;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;@RestController@RequestMapping("/testListener")public class testController12 { @GetMapping("/user") public User getUser(HttpServletRequest request){ ServletContext application = request.getServletContext(); return (User)application.getAttribute("user"); }}

启动项目,在浏览器中输http://localhost:8082/testListener/user测试一下即可,如果正常返回user信息,那么说明数据已经缓存成功,不过application这种事缓存在内存中,对内存会有消耗。

 

  

 

  

2.2 监听HTTP会话Session对象

监听器还有一个比较常用的地方就是用来监听session对象,来获取在线用户数量。

 

  

package com.example.springdemo1.util;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;@Componentpublic class MyHttpSessionListener implements HttpSessionListener { private static 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中的用户数量加一,sessionDestroyed方法方法刚好相反,不再赘述,然后我们再写一个controller来测试一下:

 

  

package com.example.springdemo1.controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@RestController@RequestMapping("/testMyListener")public class testController13 { /** * 获取当前在线人数,该方法有bug * @param request * @return */ @GetMapping("/total") public String getTotalUser(HttpServletRequest request) { Integer count = (Integer) request.getSession().getServletContext().getAttribute("count"); return "当前在线人数:" + count; }}

 

  

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT的更多内容!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: