为什么说要慎用SpringBoot @ComponentScan

目录
  • 场景复现
  • 解密
  • 解决方案

场景复现

为了统一定制一个过滤器(Filter),所以在另外一个工程里面创建了一个过滤器,并通过jar包的方法导入当前项目,通过@ComponentScan({"org.example.config"})指定扫描包路径。

下面的我的启动类

导入的jar

问题

预期效果是这样,正常加载

启动后,原来的Swagger目录进去是这样的,原来的Controller全部都没有被加载进来

解密

以为过滤器导致所有路径没有加载,后面百度了解BasicErrorController是在没有定义SwaggerConfig配置时默认的controller

那我的SwaggerConfig就没有生效了呀???

水落石出了,SwaggerConfig没有被加载到容器中,原来是启动类惹的货,为了加载一个启动类外的bean-MyFilterBean到容器中导致--启动类配置@ComponentScan({"org.example.config"})

如果启动类不加@ComponentScan注解,那它默认是扫描启动类及子包下的类。我这配置不就是改变了最初的功能吗,真的是基础不牢地洞山摇~~~

解决方案

1、多加个@ComponentScan,这样也扫描启动类及子包下的类了

2、直接将当前启动类路径加入扫描路径中

3、

在resourecs资源目录下创建META-INF文件夹,在文件夹中创建spring.factories文件

文件内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.example.config.MyFilterBean

启动后发现MyFilterBean也被加载到bean中了(在调用api时,通过日记/断点等验证)

注:

由于直接在过滤器类上使用@Compont注解注册过滤器默认会过滤所有的URL请求生效,上面测试时都是为了方便。真实使用时,为了可以控制特定的URL才触发过滤器,我们通过FilterRegistrationBean来注册过滤器,过滤的URL模式通过FilterRegistrationBean类的addUrlPatterns方法设置,如下图所示:

到此这篇关于为什么说要慎用SpringBoot @ComponentScan的文章就介绍到这了,更多相关SpringBoot @ComponentScan 慎用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot @ComponentScan注解原理解析

    这篇文章主要介绍了springboot @ComponentScan注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @ComponentScan 告诉Spring从哪里找到bean. 如果你的其他包都在@SpringBootApplication注解的启动类所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了. 如果你有一些bean所在的包,不在启动类的包及其下级包,那么你需要手动加上@Compone

  • 为什么说要慎用SpringBoot @ComponentScan

    目录 场景复现 解密 解决方案 场景复现 为了统一定制一个过滤器(Filter),所以在另外一个工程里面创建了一个过滤器,并通过jar包的方法导入当前项目,通过@ComponentScan({"org.example.config"})指定扫描包路径. 下面的我的启动类: 导入的jar: 问题 预期效果是这样,正常加载 启动后,原来的Swagger目录进去是这样的,原来的Controller全部都没有被加载进来 解密 以为过滤器导致所有路径没有加载,后面百度了解BasicErrorCo

  • SpringBoot中@ComponentScan的使用详解

    目录 SpringBoot @ComponentScan的使用 SpringBoot @ComponentScan 作用 SpringBoot @ComponentScan的使用 SpringBoot的启动类中有一个@ComponentScan,之前项目由于这个注解造成打包失败,这里对于这个注解进行总结,防止下次遇到这个问题再被难住. 其实这个注解主要是针对于第三方jar包中注解的应用. 如果第三方包中没有使用注解那么就完全不需要使用这个注解 使用方式如图所示,这里扫描的是 maven项目的依赖

  • SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

    目录 SpringBoot默认包扫描机制 @ComponentScan的使用 常用参数含义 @Component与@ComponentScan SpringBoot默认包扫描机制 标注了@Component和@Component的衍生注解如@Controller,@Service,@Repository就可以把当前的Bean加入到IOC容器中.那么SpringBoot是如何知道要去扫描@Component注解的呢.@ComponentScan做的事情就是告诉Spring从哪里找到bean Spr

  • Springboot项目实现将类从@ComponentScan中排除

    目录 将类从@ComponentScan中排除 问题描述 方案一 方案二 方案三 方案四 @ComponentScan 详解 将类从@ComponentScan中排除 问题描述 最近在学习SpringCloud的Ribbon,在使用 @RibbonClient(name = "SPRINGCLOUD-P-DEPT", configuration = RibbonConfig.class) 为服务指定负载均衡策略的时候,根据Ribbon官方文档介绍,自定义的Ribbon配置类不允许被Sp

  • springboot+maven快速构建项目的示例代码

    最近公司运用springboot构建项目,确实比ssh搭建要快很多. 1.首先要下载maven,用maven管理项目很方便,下载完maven配置好环境,maven我就不细说了. 2.创建一个maven项目,pom.xml文件里面写这些: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sche

  • Spring-Boot 集成Solr客户端的详细步骤

    Solr 是基于 Lucene 的全文检索服务器,可配置.可扩展,并对索引和搜索性能进行了优化.Solr 多用于电子商务网站.门户.论坛这类网站的站内搜索.Solr 可以独立运行在 Jetty.Tomcat 等这些 Servlet 容器中.Solr 索引的实现非常简单,用 POST 方法去向 Solr服务器发送一个描述 Field 及其内容的 JSON 文档,Solr 根据 JSON 文件增删改索引.Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回 JSON 格式的查询结

  • springboot下配置多数据源的方法

    一.springboot 简介 SpringBoot使开发独立的,产品级别的基于Spring的应用变得非常简单,你只需"just run". 我们为Spring平台及第三方库提 供开箱即用的设置,这样你就可以有条不紊地开始.多数Spring Boot应用需要很少的Spring配置. 你可以使用SpringBoot创建Java应用,并使用 java -jar 启动它或采用传统的war部署方式.我们也提供了一个运行"spring 脚本"的命令行工具. 二.传统的Dat

  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

    一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来. 从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等).两者之间

  • springboot扫描自定义的servlet和filter代码详解

    这几天使用spring boot编写公司一个应用,在编写了一个filter,用于指定编码的filter,如下: /** * Created by xiaxuan on 16/11/1. */ @WebFilter(urlPatterns = "/*",filterName="CharacterEncodeFilter", initParams={ @WebInitParam(name="encoding",value="UTF-8&qu

随机推荐