十三,Spring Boot 中注入 Servlet,Filter,Listener

十三,Spring Boot 中注入 Servlet,Filter,Listener

文章目录

  • 十三,Spring Boot 中注入 Servlet,Filter,Listener
  • 1. 基本介绍
  • 2. 第一种方式:使用注解方式注入:Servlet,Filter,Listener
    • 2.1 使用注解方式注入:Servlet
    • 2.2 使用注解方式注入:Filter
    • 2.3 使用注解方式注入:Listener
  • 3. 第二种方式:使用 RegistrationBean 方式注入 Servlet,Filter,Listener
    • 3.1 使用 RegistrationBean 方式注入 Servlet
    • 3.2 使用 RegistrationBean 方式注入 Filter
    • 3.3 使用 RegistrationBean 方式注入 Listener
  • 4. 注意事项和细节说明
  • 5. 总结:
  • 6. 最后:


1. 基本介绍

  1. 考虑到实际开发业务非常复杂和兼容,Spring-Boot 支持将 Servlet,Filter ,Listener注入Spring容器,成为Spring bean
  2. 也就是说明 Spring Boot 开放了和原生 WEB组件(Servlet,Filter,Listener)的兼容。

在Spring Boot 当中对应 Servlet,Filter (过滤器),Listener(监听器)的注入,有两种方式:

  • 第一种方式:使用注解方式注入 。
  • 第二种方式:使用 RegistrationBean方式注入 Servlet,Filter,Listener 的方式注入。

2. 第一种方式:使用注解方式注入:Servlet,Filter,Listener

2.1 使用注解方式注入:Servlet

使用(@WebServlet + @ServletComponentScan ) 这两个注解方式注入 Servlet

提示: urlPatterns = {“/servlet01”,“servlet02”},对Servlet配置了url-pat:请求路径的映射

  • 注入的原生的 Servlet_,不会被Spring boot的拦截器拦截
  • 对于开发的原生的Servlet,需要使用@ServletComponentScan指定要扫描的原生Servlet,才会注入到 Spring容器当中,注意:是在启动场景的位置添加该@ServletComponentScan注解。

在这里插入图片描述

package com.rainbowsea.springboot.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;// 使用 extends 继承的方式(@WebServlet + @ServletComponentScan 注解),注入 servlet
@WebServlet(urlPatterns = {"/servlet01","/servlet02"}) // 注意是: / 开头
public class Servlet_ extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {// 在前端显示打印显示一些信息。response.getWriter().write("hello , Servlet_!");}
}

注意需要在对应项目的场景启动器的位置,使用@ServletComponentScan 注解,在该注解的 basePackages 属性指明要让 Spring Boot扫描到的包的路径。让 Spring Boot可以找到你想让它注入的 ioc 容器当中的类。

在这里插入图片描述

package com.rainbowsea.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication // 项目启动标志
@ServletComponentScan(basePackages = {"com.rainbowsea.springboot"})
public class Application {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);//ioc.stop();  // 停止容器System.out.println("hello");}
}

运行测试:

在这里插入图片描述

2.2 使用注解方式注入:Filter

使用(@WebFilter+ @ServletComponentScan ) 这两个注解方式注入 Filter

注意注入的 Filter 过滤器要实现 implements javax.servlet.Filter 下的 Filter

/ 注意是:  javax.servlet.Filter 下的 Filter
// 注入过滤器:(使用: @WebFilter(urlPatterns = {"/css/*","/images/*"}) + @ServletComponentScan(basePackages = {"com.rainbowsea.springboot"}))
/*
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
@WebFilter 表示 Filter_是一个过滤器,并注入容器
urlPatterns = {"/css/*", "/images/*"} 当请求 /css/ 目录资源或者images
解读: 直接放行后,在经过拦截器,拦截器是否拦截要根据拦截器的拦截规则特别说明在:之前下面这样配置的拦截器也是会拦截内容的。@Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addInterceptors(InterceptorRegistry registry) {System.out.println("addInterceptors~~~");// 注册拦截器registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/login","/images/**");}};}

注意:过滤器配置的urlPatterns 也会经过 Spring-Boot拦截器,所以为了
看到效果,请在拦截器配置放行 /css/**,
在 servlet 表示全部匹配是 "/*";而在 Spring boot 中表示全部匹配的是: "/**"

在这里插入图片描述

package com.rainbowsea.springboot.servlet;import lombok.extern.slf4j.Slf4j;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Slf4j
@WebFilter(urlPatterns = {"/static/css/*", "/images/*"})  // 注意:是/开头
public class Filter_ implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("--Filter_ init0--");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("Filter - doFitler");// 为了方便观察过滤器处理的资源,我们输出一个urlHttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;log.info("过滤器处理的 url={}",httpServletRequest.getRequestURI());// 我们直接放行,实际开发中,根据自己的业务来决定如何处理filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("Filter -destory");}
}

同样注意:需要在对应项目的场景启动器的位置,使用@ServletComponentScan 注解,在该注解的 basePackages 属性指明要让 Spring Boot扫描到的包的路径。让 Spring Boot可以找到你想让它注入的 ioc 容器当中的类。

在这里插入图片描述

运行测试:

在这里插入图片描述

2.3 使用注解方式注入:Listener

使用(@WebListener+ @ServletComponentScan ) 这两个注解方式注入 Servlet

在这里插入图片描述

package com.rainbowsea.springboot.servlet;import lombok.extern.slf4j.Slf4j;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;// 注入监听器(@WebListener + @ServletComponentScan(basePackages = {"com.rainbowsea.springboot"}))
@Slf4j
@WebListener
public class Listener_ implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 这里可以加入项目初始化的相关业务代码log.info("Listener_ contextInitialized 项目初始化OK~");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 这里可以加入相应代码...log.info("Listener_ contextInitialized 项目销毁OK~");}
}

同样注意:需要在对应项目的场景启动器的位置,使用@ServletComponentScan 注解,在该注解的 basePackages 属性指明要让 Spring Boot扫描到的包的路径。让 Spring Boot可以找到你想让它注入的 ioc 容器当中的类。

在这里插入图片描述

运行测试:

在这里插入图片描述

在这里插入图片描述

3. 第二种方式:使用 RegistrationBean 方式注入 Servlet,Filter,Listener

3.1 使用 RegistrationBean 方式注入 Servlet

在这里插入图片描述

package com.rainbowsea.springboot.config;import com.rainbowsea.springboot.servlet.Filter_;
import com.rainbowsea.springboot.servlet.Listener_;
import com.rainbowsea.springboot.servlet.Servlet_;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Arrays;// 使用  配置类的方式注入,servlet,和 Listener监听器,filter过滤器/** @Configuration(proxyBeanMethods = true)* @Configuration 表示是一个配置类* proxyBeanMethods = true 默认是单例返回 bean(保证每个 @bean 方法被调用多少次,都是同一个)*/
@Configuration(proxyBeanMethods = true)
public class RegisterConfig_ {// 以使用RegistrationBean 方式// 注入 Servlet// 注意:要加上 Bean 对象//@Bean(name = "Servlet_") // bean 没有指明name的话,默认是以方法名作为 name/id@Beanpublic ServletRegistrationBean servlet2() {// 创建原生的 Servlet 对象(就是我们自己创建的 Servlet)Servlet_ servlet_ = new Servlet_();// 把 Servlet_ 对象 关联到 ServletRegistrationBean 对象// "/servlet03" 就是注入Servlet的url-patternreturn new ServletRegistrationBean(servlet_, "/servlet03");}}
package com.rainbowsea.springboot.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class Servlet_ extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {// 在前端显示打印显示一些信息。response.getWriter().write("hello , Servlet_!");}
}

注意需要在对应项目的场景启动器的位置,使用@ServletComponentScan 注解,在该注解的 basePackages 属性指明要让 Spring Boot扫描到的包的路径。让 Spring Boot可以找到你想让它注入的 ioc 容器当中的类。

在这里插入图片描述

package com.rainbowsea.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication // 项目启动标志
@ServletComponentScan(basePackages = {"com.rainbowsea.springboot"})
public class Application {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);//ioc.stop();  // 停止容器System.out.println("hello");}
}

运行测试:

在这里插入图片描述

3.2 使用 RegistrationBean 方式注入 Filter

在这里插入图片描述

package com.rainbowsea.springboot.config;import com.rainbowsea.springboot.servlet.Filter_;
import com.rainbowsea.springboot.servlet.Listener_;
import com.rainbowsea.springboot.servlet.Servlet_;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Arrays;// 使用  配置类的方式注入,servlet,和 Listener监听器,filter过滤器/** @Configuration(proxyBeanMethods = true)* @Configuration 表示是一个配置类* proxyBeanMethods = true 默认是单例返回 bean(保证每个 @bean 方法被调用多少次,都是同一个)*/
@Configuration(proxyBeanMethods = true)
public class RegisterConfig_ {// 注入 Filter// 注意:要加上 Bean 对象@Bean(name = "Filter_")public FilterRegistrationBean filter2() {// 创建原生的 Filter_ 对象(就是我们自己创建的 Filter_)Filter_ filter_ = new Filter_();FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter_);// 设置 filter 的 url-pattern// Arrays.asList("/css/*","images/*") 将字符串,转换为 集合// 注意:不要漏 "/" 开头了。filterRegistrationBean.setUrlPatterns(Arrays.asList("/css/*", "/images/*"));return filterRegistrationBean;}}
package com.rainbowsea.springboot.servlet;import lombok.extern.slf4j.Slf4j;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Slf4j
public class Filter_ implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("--Filter_ init0--");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("Filter - doFitler");// 为了方便观察过滤器处理的资源,我们输出一个urlHttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;log.info("过滤器处理的 url={}",httpServletRequest.getRequestURI());// 我们直接放行,实际开发中,根据自己的业务来决定如何处理filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("Filter -destory");}
}

同样注意:需要在对应项目的场景启动器的位置,使用@ServletComponentScan 注解,在该注解的 basePackages 属性指明要让 Spring Boot扫描到的包的路径。让 Spring Boot可以找到你想让它注入的 ioc 容器当中的类。

在这里插入图片描述

运行测试:

在这里插入图片描述

3.3 使用 RegistrationBean 方式注入 Listener

在这里插入图片描述

package com.rainbowsea.springboot.config;import com.rainbowsea.springboot.servlet.Filter_;
import com.rainbowsea.springboot.servlet.Listener_;
import com.rainbowsea.springboot.servlet.Servlet_;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Arrays;// 使用  配置类的方式注入,servlet,和 Listener监听器,filter过滤器/** @Configuration(proxyBeanMethods = true)* @Configuration 表示是一个配置类* proxyBeanMethods = true 默认是单例返回 bean(保证每个 @bean 方法被调用多少次,都是同一个)*/
@Configuration(proxyBeanMethods = true)
public class RegisterConfig_ {// 注入: Listener//@Bean(name = "Listener_")@Beanpublic ServletListenerRegistrationBean Listener2() {
// 创建原生的 Listener_ 对象(就是我们自己创建的 Listener_)Listener_ listener_ = new Listener_();return new ServletListenerRegistrationBean(listener_);}
}
package com.rainbowsea.springboot.servlet;import lombok.extern.slf4j.Slf4j;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;// 注入监听器(@WebListener + @ServletComponentScan(basePackages = {"com.rainbowsea.springboot"}))
@Slf4j
@WebListener
public class Listener_ implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 这里可以加入项目初始化的相关业务代码log.info("Listener_ contextInitialized 项目初始化OK~");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 这里可以加入相应代码...log.info("Listener_ contextInitialized 项目销毁OK~");}
}

同样注意:需要在对应项目的场景启动器的位置,使用@ServletComponentScan 注解,在该注解的 basePackages 属性指明要让 Spring Boot扫描到的包的路径。让 Spring Boot可以找到你想让它注入的 ioc 容器当中的类。

在这里插入图片描述

运行测试:

在这里插入图片描述

在这里插入图片描述

4. 注意事项和细节说明

请求 (自己所编写的)Servlet 时,为什么不会到达拦截器

请求 Servlet 时,不会到达 DispatherServlet,因此也不会到达拦截器
原因分析:
注入的Servlet会存在Spring容器
DispatherServlet也存在Spring 容器
多个Servlet容器能处理到同一层拦截,精确优先原则/最长前缀匹配原则
所以当请求 /servlet01 时,就会直接匹配到注入的servlet
简单的说:就是当你 servlet之间跳转通信的时候,是先找同一层的servlet,如果你同一层的
servlet有你所需要的映射的请求路径,那么优先跳转到servlet上,而不走 拦截器了,因为拦截器是在介于 servlet 和 Controller 控制器之间的。
大家可以回忆一下:我们讲过的 Tomcat 在对 Servlet url 匹配的原则,多个servlet都能处理到同一层路径,精确优先原则/最长前缀匹配原则
在Spring Boot 中,去调用@Controller 目标方法,是按照 DispatherServlet 分发匹配的机制,请同学们回顾一下,我们自己实现Spring MVC 的底层机制的程序。

5. 总结:

  1. 第一种方式:使用注解方式注入Servlet,Filter,Listener:

    1. 使用(@WebServlet + @ServletComponentScan ) 这两个注解方式注入 Servlet
    2. 使用(@WebFilter+ @ServletComponentScan ) 这两个注解方式注入 Filter
    3. 使用(@WebListener+ @ServletComponentScan ) 这两个注解方式注入 Servlet
  2. 第二种方式:使用 RegistrationBean 方式注入 Servlet,Filter,Listener 。

  3. 注意:无论是第一种方式还是第二种方式,都必须在对应项目的场景启动器的位置上,使用上: @ServletComponentScan注解。在该注解的 basePackages 属性指明要让 Spring Boot扫描到的包的路径。让 Spring Boot可以找到你想让它注入的 ioc 容器当中的类。

    在这里插入图片描述

6. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535802.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——应用层自定义协议与序列化

目录 一应用层 1再谈 "协议" 2序列化与反序列化 3理解read,write,recv,send 4Udp vs Tcp 二网络版本计算器 三手写序列和反序列化 四进程间关系与守护进程 1进程组 1.1什么是进程组 1.2组长进程 2会话 2.1什么是会话 2.2会话下的前后台进程 3作业控…

基于Arduino Uno的简易可视化操作界面设计

Arduino UNO是基于ATmega328P的Arduino开发板。它有14个数字输入/输出引脚(其中6个可用于PWM输出)、6个模拟输入引脚,一个16 MHz的晶体振荡器,一个USB接口,一个DC接口,一个ICSP接口,一个复位按钮…

C++速通LeetCode简单第16题-买卖股票的最佳时机

思路要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益 class Solution { public://要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益int maxProfit(vector<int>& prices) {int ans 0;int lowest prices[0];for(int i 1; i &…

COMP 6714-Info Retrieval and Web Search笔记week1

哭了哭了&#xff0c;这周唯一能听懂的就这门 目录 IR&#xff08;Information Retrieval)是什么&#xff1f;IR的基本假设Unstructured (text) vs. structuredDocuments vs. Database Records比较文本&#xff08;Comparing Text&#xff09;IR的范围(Dimensions of IR)IR的任…

多线程1(游戏逆向)

#include<iostream> #include<windows.h> #include<tchar.h> #include<stdio.h> #include <process.h> #pragma warning(disable:4996) //exe应用程序 VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT X坐标, …

基于SSM的银发在线教育云平台的设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来留言咨询。 一、摘要 现在的科技进步使得人们的学习不仅…

C++面试常见手撕题目

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 分享常见的面试手撕…

CC2530实现按键控制LED

实现按钮控制LED1开启和关闭 1配置环境 2扩展资料 通用io和外设io 设置输入输出 设置输入模式 3实例代码 #include "ioCC2530.h"void delay(int n){int i,j;for(i0;i<n;i){for(j0;j<240;j){asm("NOP");asm("NOP");asm("NOP")…

在 Python 画图中同时设置中英文字体

前言 在使用matplotlib.pyplot画图时&#xff0c;默认情况下都是黑体字&#xff0c;很不美观。如果含有中文&#xff0c;可能无法显示&#xff1b;显示了中文之后英文字体就不能使用。本文针对这些问题逐一给出解决方案。 同时设置中英文字体 我们都知道&#xff0c;按照下面的…

8路模拟量采集模块,4~20mA 0~10V电流电压高速采集——DAM-3054P

阿尔泰科技 DAM-3054P为8路差分模拟量采集模块&#xff0c;高速采集&#xff0c;每通道采集速率为500sps&#xff0c;16位AD&#xff0c;支持RS485通讯接口&#xff0c;带有标准ModbusRTU协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 指标参数&…

Spring Boot母婴商城:安全、便捷、高效

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架…

PSINS工具箱函数介绍——kfplot

关于工具箱 kfplot是图像绘制的函数,用于绘制关于滤波(前/后)的误差图像。 本文所述的代码需要基于PSINS工具箱,工具箱的讲解: PSINS初学指导:https://blog.csdn.net/callmeup/article/details/137087932使用方法 函数形式为: k f p l o t ( x k p k , v a r a r g i…

利用AI增强现实开发:基于CoreML的深度学习图像场景识别实战教程

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

指针求函数的最大值,传递的只有一个参数如何比较两个整数的最大值

指针求函数的最大值&#xff0c;传递的只有一个参数如何比较两个整数的最大值 指针求函数的最大值&#xff0c;传递的只有一个参数如何比较两个整数的最大值 文章目录 指针求函数的最大值&#xff0c;传递的只有一个参数如何比较两个整数的最大值指针求函数的最大值&#xff0…

【硬件模块】SHT20温湿度传感器

SHT20是一个用IIC通信的温湿度传感器。我们知道这个就可以了。 它支持的电压范围是2.1~3.6V&#xff0c;推荐是3V&#xff0c;所以如果我们的MCU是5V的&#xff0c;那么就得转个电压才能用了。 IIC常见的速率有100k&#xff0c;400k&#xff0c;而SHT20是支持400k的&#xff08…

yolo-word复现

github下载代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 配置环境&#xff1a; 官方的方式 当然也可以按照官方给的配置方式去安装库&#xff0c;我也试了&#xff0c;出现小问题了。 我这边是从我本身的yolov8的环境克隆过来的&#xff0c;然后安装我环境里没有…

MyBatis 数据处理:主键获取、批量删除与动态表名

MyBatis 数据处理&#xff1a;主键获取、批量删除与动态表名 1.主键获取 XML配置中使用了useGeneratedKeys"true"和keyProperty"id"来自动获取并设置插入后的自增主键。这是一个标准的做法。 1&#xff09;mapper接口 /*** 添加数据时获取自增id*/ int a…

大数据处理技术:MapReduce综合实训

目录 1 实验名称 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 WordCount词频统计 5.2 HDFS文件读写 5.3 倒排索引 5.4 网页排序——PageRank算法 6 实验结果 6.1 WordCount词频统计 6.2 HDFS文件读写 6.3 倒排索引 6.4 网页排序——PageRank算法 1…

Spring Event 业务解耦神器(泛型喔!)

一.前言 又与我一直负责Cocos Creator的开发,我发现在TS领域,是可以自定义事件(有兴趣的大宝可以坐飞机直达:[CocosCreator]自定义事件(订阅/发布)管理器),这样做有什么好处呢?回答:解耦! 于是乎,我就觉得前端能干的事,后端也一样能干!当然,如果后端是TS或JS写的,比如nodeJS,…