十三,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.rhkb.cn/news/427684.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】——多态详解

目录 1、什么是多态? 2、多态的定义及实现 2.1多态的构成条件 ​2.2多态语法细节处理 2.3协变 2.4析构函数的重写 2.5C11 override 和 final关键字 2.6重载—重写—隐藏的对比分析 3、纯虚函数和抽象类 4、多态的原理分析 4.1多态是如何实现的 4.2虚函数…

OpenCV 2

目录 图像平滑处理 高斯与中值滤波 图像阈值 ​编辑 Canny边缘检测 非极大值抑制 边缘检测效果 轮廓检测方法 ​编辑 ​编辑​编辑 轮廓检测结果 轮廓特征与近似 图像平滑处理 以上两种出来的图片效果 以上的效果,因为填的是normalize False,越界…

零基础到项目实战:Node.js版Selenium WebDriver教程

在当今数字化时代,Web应用程序的质量和性能至关重要。为了确保这些应用的可靠性,自动化测试成为一种不可或缺的工具。Selenium,作为自动化测试领域的瑰宝,为我们提供了无限可能。本教程将深入介绍Selenium,以及如何结合…

硬盘数据恢复必备:4 款强大硬盘数据恢复软件推荐!

在数字化的时代,我们的生活和工作越来越离不开电脑,而硬盘作为重要的数据存储设备,一旦出现数据丢失的情况,往往会给我们带来极大的困扰。别担心,今天就为大家推荐四款强大的硬盘数据恢复软件,帮助你轻松找…

优化算法(三)—模拟退火算法(附MATLAB程序)

模拟退火算法(Simulated Annealing, SA)是一种基于概率的优化算法,旨在寻找全局最优解。该算法模拟金属退火过程中的物质冷却过程,逐渐降低系统的“温度”以达到全局优化的效果。它特别适用于解决复杂的组合优化问题。 一、模拟退…

[羊城杯 2020]Blackcat1

知识点:数组加密绕过 进入页面熟悉的web三部曲(url地址,web源代码,web目录扫描) url地址没有什么东西去看看源代码. 这有一个mp3文件点一下看看. 在最后面发现了 PHP源码. if(empty($_POST[Black-Cat-Sheriff]) || em…

Android Studio报错: Could not find pub.devrel:easypermissions:0.3.0, 改用linux编译

在Android studio中去编译开源的仓库,大概率就是各种编译不过,一堆错误,一顿改错,基本上会耗费非常多时间,比如: 这个就是改gradle版本,改成7.2 ,修改完成之后,还有其他报…

翻页时钟 2.0-自动置顶显示,点击小时切换显示标题栏不显示标题栏-供大家学习研究参考

更新内容 自动置顶显示点击小时切换显示标题栏,(显示标题栏后可移动时钟位置,鼠标拖动边框调整时钟大小)不显示标题栏时,透明部分光标可穿透修正一个显示bu 下载地址: https://download.csdn.net/download…

iPhone 16系列:熟悉的味道,全新的体验

来看看iPhone 16和Plus这两个新成员,实话说,它们和之前曝光的样子几乎完全一致。下面我们就一起来细数一下这次的几大变化吧。 外观设计:焕然一新 首先,最显眼的变化就是后置镜头模组的布局调整为了垂直排列。这一改变使得整个背…

小程序开发设计-第一个小程序:安装开发者工具③

上篇文章导航: 小程序开发设计-第一个小程序:注册小程序开发账号②-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219035?spm1001.2014.3001.5501 须知:不同版本选项有所不同,并无大碍。 第一个小程序&#…

《黑神话悟空》开发框架与战斗系统解析

本文主要围绕《黑神话悟空》的开发框架与战斗系统解析展开 主要内容 《黑神话悟空》采用的技术栈 《黑神话悟空》战斗系统的实现方式 四种攻击模式 连招系统的创建 如何实现高扩展性的战斗系统 包括角色属性系统、技能配置文件和逻辑节点的抽象等关键技术点 版权声明 本…

中国书法—孙溟㠭浅析碑帖《爨宝子碑》

中国书法——孙溟㠭浅析碑帖《爨宝子碑》 《爨宝子碑》 全称是《晋故振威将军建宁太守爨宝子之墓》,此碑刻于东晋大亨四年(公元405年)属楷书体。 《爨宝子碑》 《爨宝子碑》 至清朝乾隆四十三年(1778年)在云南南宁&…

【开源免费】基于SpringBoot+Vue.JS网上购物商城(JAVA毕业设计)

本文项目编号 T 041 ,文末自助获取源码 \color{red}{T041,文末自助获取源码} T041,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

PHP邮箱系统:从入门到实战搭建教程指南!

PHP邮箱系统配置教程?如何选用合适的PHP邮箱系统库? 为了满足个性化和定制化的需求,许多开发者选择使用PHP来搭建自己的邮箱系统。AokSend将带你从入门到实战,详细介绍如何搭建一个功能完善的PHP邮箱系统。 PHP邮箱系统&#xf…

C#软键盘设计字母数字按键处理相关事件函数

应用场景:便携式设备和检测设备等小型设备经常使用触摸屏来代替键盘鼠标的使用,因此在查询和输入界面的文本或者数字输入控件中使用软件盘来代替真正键盘的输入。 软键盘界面:软键盘界面实质上就是一个普通的窗体上面摆放了很多图片按钮&…

Golang | Leetcode Golang题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; func canPartition(nums []int) bool {n : len(nums)if n < 2 {return false}sum, max : 0, 0for _, v : range nums {sum vif v > max {max v}}if sum%2 ! 0 {return false}target : sum / 2if max > target {return false}dp …

对象检测边界框损失 – 从IOU到ProbIOU

1.概述 目标检测损失函数的选择在目标检测问题建模中至关重要。通常&#xff0c;目标检测需要两个损失函数&#xff0c;一个用于对象分类&#xff0c;另一个用于边界框回归&#xff08;BBR&#xff09;。本文将重点介绍 IoU 损失函数&#xff08;GIoU 损失、DIoU 损失和 CIoU 损…

一、Numpy使用

1、numpy的简单使用 import numpy as np #利用as给numpy起一个别名np# 使用array来承接这个数组 array np.array([[1,2,3],[2,3,4]])print(array) print("number of dim:", array.ndim) # ndim 数组维度 print("shape:", array.shape) # 数组的形…

Spring Boot从0到1 -day02

目录 学习目标Spring Boot 的基本配置启动类与核心注解SpringBootApplicationSpring Boot 的全局配置文件1. application.properties2. application.ymlSpring 中Spring Boot Application注解的作用 自动配置原理1. 自动配置类2. 自动配置的发现示例3. 自定义自动配置 条件注解…

Prompt最佳实践|指定输出的长度

在OpenAI的官方文档中已经提供了[Prompt Enginerring]的最佳实践&#xff0c;目的就是帮助用户更好的使用ChatGPT 编写优秀的提示词我一共总结了9个分类&#xff0c;本文讲解第6个分类&#xff1a;指定输出长度 提供更多的细节要求模型扮演角色使用分隔符指定任务步骤提供样例…