最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中使用監(jiān)聽器的方法詳解

 更新時間:2022年03月14日 14:15:44   作者:即將翻身的咸魚  
這篇文章主要為大家詳細介紹了SpringBoot中使用監(jiān)聽器的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1.監(jiān)聽器

web監(jiān)聽器是一張Servlet中特殊的類,它們能幫助開發(fā)者監(jiān)聽web中特定的事件,比如ServletContext,HttpSession,ServletRequest的創(chuàng)建和銷毀;變量的創(chuàng)建、銷毀、和修改等??梢栽谀承﹦幼髑昂笤黾犹幚?,實現(xiàn)監(jiān)控

2.SpringBoot中監(jiān)聽器的使用

web監(jiān)聽器的使用場景很多,比如監(jiān)聽servlet上下文用來初始化一些數(shù)據(jù)、監(jiān)聽http session用來獲取當前在線的人數(shù)、監(jiān)聽客戶端請求的servletrequest對象來獲取用戶的訪問信息等。

2.1 監(jiān)聽Servlet上下文對象

監(jiān)聽Servlet上下文對象可以用來初始化數(shù)據(jù),用于緩存。舉個例子:比如用戶在點擊某個網(wǎng)站的首頁時,一般都會展現(xiàn)出首頁的一些信息,而這些信息基本上或者大部分時間都保持不變的,但是這些信息都是來自數(shù)據(jù)庫,如果用戶的每次點擊,都要從數(shù)據(jù)庫中去獲取數(shù)據(jù)的話,用戶量少還可以接受,如果用戶量非常大的話,這對數(shù)據(jù)庫也是一筆很大的開銷。

針對這種首頁數(shù)據(jù),大部分都不常更新的話,我們完全可以把它們緩存起來,每次用戶點擊的時候,我們都直接從緩存中拿,這樣既可以提高首頁的訪問速度,又可以降低服務器的壓力,如果做得更加靈活一點,可以再加個定時器,定期的來更新這個首頁緩存,就類似于csdn個人博客首頁中排名的變化一樣

下面我們針對這個功能,來寫一個Service,模擬一下從數(shù)據(jù)庫查詢數(shù)據(jù):

package com.example.springdemo1.service;
import com.example.springdemo1.pojo.User;
import org.springframework.stereotype.Service;
@Service
public class UserService2 {
    public User getUser(){
        //實際中會根據(jù)具體的業(yè)務場景,從數(shù)據(jù)庫中查詢對應的信息
        return new User(10,"lyh10","123456");
    }
}

然后寫一個監(jiān)聽器,實現(xiàn)ApplicationListener接口,重寫onApplicationEvent方法,將ContextRefreshedEvent對象傳進去,如果我們想在加載或刷新應用上下文時,也重新刷新下我們預加載的資源,就可以通過監(jiān)聽ContextRefreshedEvent來做這樣的事情,如下:

package com.example.springdemo1.util;
import com.example.springdemo1.pojo.User;
import com.example.springdemo1.service.UserService2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContext;
@Component
public class MyServletContextListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        //先獲取到application上下文
        ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();
        //獲取對應的Service
        UserService2 userService2 = applicationContext.getBean(UserService2.class);
        User user = userService2.getUser();
        //獲取application域對象,將查到的信息放到application域中
        ServletContext application = applicationContext.getBean(ServletContext.class);
        application.setAttribute("user",user);
    }
}

首先通過contextRefreshedEvent來獲取application上下文,再通過application上下文來獲取UserService這個bean,然后再調用自己的業(yè)務代碼獲取相應的數(shù)據(jù),最后存儲到application域中,這樣前端在請求相應數(shù)據(jù)的時候,我們就可以直接從application域中獲取信息,減少數(shù)據(jù)庫的壓力,下面寫一個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信息,那么說明數(shù)據(jù)已經緩存成功,不過application這種事緩存在內存中,對內存會有消耗。

2.2 監(jiān)聽HTTP會話Session對象

監(jiān)聽器還有一個比較常用的地方就是用來監(jiān)聽session對象,來獲取在線用戶數(shù)量。

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;
@Component
public class MyHttpSessionListener implements HttpSessionListener {
    private static Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);
    //記錄在線的用戶數(shù)量
    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);
    }
}

可以看出,首先該監(jiān)聽器需要實現(xiàn)HttpSessionListener接口,然后重寫sessionCreated和sessionDestroyed方法,在sessionCreated方法中傳遞一個httpSessionEvent對象,然后將當前session中的用戶數(shù)量加一,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 {
    /**
     * 獲取當前在線人數(shù),該方法有bug
     * @param request
     * @return
     */
    @GetMapping("/total")
    public String getTotalUser(HttpServletRequest request) {
        Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");
        return "當前在線人數(shù):" + count;
    }
}

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!  

相關文章

  • JavaEE微框架Spring Boot深入解讀

    JavaEE微框架Spring Boot深入解讀

    spring框架作為JavaEE框架領域的一款重要的開源框架,在企業(yè)應用開發(fā)中有著很重要的作用。接下來通過本文給大家介紹JavaEE微框架Spring Boot深入解讀,需要的朋友可以參考下
    2017-04-04
  • springboot配置文件的加載順序解析

    springboot配置文件的加載順序解析

    這篇文章主要介紹了springboot配置文件的加載順序解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java Springboot websocket使用案例詳解

    Java Springboot websocket使用案例詳解

    這篇文章主要介紹了Java Springboot websocket使用案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • 一文詳解Object類和抽象類

    一文詳解Object類和抽象類

    這篇文章主要介紹了一文詳解Object類和抽象類,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下。希望對你的學習有所幫助
    2022-08-08
  • Spring的@Conditional詳解

    Spring的@Conditional詳解

    這篇文章主要介紹了Spring的@Conditional詳解,給想要注入Bean增加限制條件,只有滿足限制條件才會被構造并注入到Spring的IOC容器中,通常和@Bean注解一起使用,需要的朋友可以參考下
    2024-01-01
  • Java根據(jù)身份證號計算年齡,15位身份證號碼轉18位原理與操作示例

    Java根據(jù)身份證號計算年齡,15位身份證號碼轉18位原理與操作示例

    這篇文章主要介紹了Java根據(jù)身份證號計算年齡,15位身份證號碼轉18位原理與操作,結合實例形式詳細分析了構成身份證號碼的各個位的含義,15位身份證號碼轉18位的方法及Java根據(jù)身份證號計算年齡相關操作技巧,需要的朋友可以參考下
    2019-10-10
  • 淺談Java多線程的優(yōu)點及代碼示例

    淺談Java多線程的優(yōu)點及代碼示例

    這篇文章主要介紹了淺談Java多線程的優(yōu)點及代碼示例,還是比較不錯的,這里分享給大家,需要的朋友可以參考。
    2017-11-11
  • Java中的equsals和==

    Java中的equsals和==

    這篇文章主要介紹了Java中的equsals和==的相關內容,感興趣的朋朋友可以參考下文
    2021-08-08
  • java8 toMap問題(key重復如何解決)

    java8 toMap問題(key重復如何解決)

    這篇文章主要介紹了java8 toMap問題(key重復如何解決),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 以實例簡介Java中線程池的工作特點

    以實例簡介Java中線程池的工作特點

    這篇文章主要介紹了以實例簡介Java中線程池的工作特點,線程池是Java實現(xiàn)多線程編程的基礎,需要的朋友可以參考下
    2015-09-09

最新評論

满城县| 洱源县| 武川县| 正宁县| 崇礼县| 武穴市| 泽普县| 新乡市| 巍山| 眉山市| 阳江市| 台州市| 会泽县| 五寨县| 佛山市| 简阳市| 云林县| 克东县| 宁化县| 永春县| 洪泽县| 东乡| 甘肃省| 彰化市| 长宁区| 灵丘县| 庆城县| 衡阳县| 泗洪县| 靖州| 科技| 阿图什市| 张家港市| 沙坪坝区| 黄梅县| 广河县| 仪征市| 南平市| 金溪县| 清苑县| 永川市|