我在堆栈溢出中遇到了一个有趣的问题。 Brett Ryan有问题,Spring Security配置被初始化了两次。 当我查看他的代码时,我发现了问题所在。 让我展示显示代码。

他有相当标准的Spring应用程序(不使用Spring Boot)。 使用基于Spring的AbstractAnnotationConfigDispatcherServletInitializer更现代的Java servlet配置。

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class AppInitializer extendsAbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SecurityConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{WebConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}}

如您所见,有两个配置类:

  • SecurityConfig –保存Spring Security配置
  • WebConfig – Spring的主要IoC容器配置
package net.lkrnac.blog.dontscanconfigurations;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {System.out.println("Spring Security init...");auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");}}
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "net.lkrnac.blog.dontscanconfigurations")
public class WebConfig extends WebMvcConfigurerAdapter {}

注意WebConfig的组件扫描。 这是扫描软件包,所有三个类都位于该软件包中。 在servlet容器上运行此命令时,将文本“ Spring Security init…”写入控制台两次。 这意味着SecurityConfig配置被加载两次。 它已加载:

  1. 在方法AppInitializer.getRootConfigClasses()的Servlet容器初始化期间
  2. 通过类WebConfig组件扫描

为什么? 我在Spring的文档中找到了这种解释 :

请记住, @Configuration类使用@Component进行元注释 ,因此它们是组件扫描的候选对象!

因此,这是Spring的功能,因此我们要避免Servlet配置使用的Spring @Configuration组件扫描。 Brett Ryan独立地发现了这个问题,并在提到的Stack Overflow问题中展示了他的解决方案:

@ComponentScan(basePackages = "com.acme.app",excludeFilters = {@Filter(type = ASSIGNABLE_TYPE,value = {WebConfig.class,SecurityConfig.class})})

我不喜欢这种解决方案。 注释对我来说太冗长了。 另外,一些开发人员可以创建新的@Configuration类,而忘记将其包含在此过滤器中。 我宁愿指定将被Spring的组件扫描排除的特殊软件包。

  • 我在Github上创建了示例项目,以便您可以使用它。

翻译自: https://www.javacodegeeks.com/2014/12/avoid-unwanted-component-scanning-of-spring-configuration.html

避免不必要的Spring配置组件扫描相关推荐

  1. spring 组件扫描_避免不必要的Spring配置组件扫描

    spring 组件扫描 我在堆栈溢出中遇到了一个有趣的问题. Brett Ryan有问题,Spring Security配置被初始化了两次. 当我查看他的代码时,我发现了问题所在. 让我展示显示代码. ...

  2. Spring配置mapper扫描的两种方式

    一, mapperLocations方式 1, spring-mybatis.xml 2, 项目结构 3, numMapper.xml 二, configLocation方式 1, spring-my ...

  3. Spring框架学习day_02:组件扫描 / 注解内部读解 / 组件扫描中配置作用域和生命周期 / 解耦 / 自动装配(两种方式) / 读取文件

    1. 组件扫描 首先,必须让Spring扫描组件所在的包,并且,组件类的声明之前必须添加@Component注解! 其实,除了@Component注解以外,还可以使用以下注解实现同样的效果: @Con ...

  4. Spring过滤器组件自动扫描

    在这个Spring自动组件扫描的教程,您已经了解如何使Spring自动扫描您的组件.在这篇文章中,我们将展示如何使用组件过滤器自动扫描过程. 1.过滤组件 - 包含 参见下面的例子中使用Spring  ...

  5. spring组键扫描

    <!-- 配置组件扫描 --><context:component-scan base-package="controller"/><!-- 配置MV ...

  6. java 扫描包框架_java – 在Android中实现类似Spring的包扫描

    我正在尝试为我正在开发的 Android框架实现类似于Spring的组件扫描的包扫描功能.基本上,我希望能够指定一个基本包,例如com.foo.bar并检索具有特定注释的所有Class实例.我不想用我 ...

  7. Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“

    1. Spring框架的作用 Spring框架的主要作用是创建对象和管理对象. 创建对象:类似于User user = new User(); 管理对象:随时可以通过Spring框架获取对象,甚至Sp ...

  8. Spring注解的使用之配置组件

    Spring的注解式编程 配置组件(Configur Components) @Configuration @ComponentScan @Scope @Lazy @Conditional @Impo ...

  9. 2.3.3 spring属性注入-注解注入-全注解-配置类扫描

    代码: spring2-属性注入-全注解-配置类扫描.zip - 蓝奏云文件大小:12.3 K|https://www.lanzouw.com/iPK5vvq21uf 这个博客,我们使用全注解的方式来 ...

最新文章

  1. 2021年大数据ELK(三):Lucene全文检索库介绍
  2. Spring Boot神操作-多个数据源Service层封装
  3. 8086存储器编址 和 I/O编址
  4. php 验证微信token_php之微信公众号验证token获取access_token
  5. python教学视频p_python接口自动化28requestshtml爬虫框架
  6. SQL建表公共字段脚本
  7. 天线越大越好吗_无线路由知识误区!解读天线数量与信号强弱的关系
  8. Windows Server 2012安装 .NET Framework 3.5
  9. 【转】AsyncTask的用法
  10. linux平台上不同类型的压缩文件的压缩与解压
  11. 负熵主义者_未来主义者
  12. cad导出pdf_CAD手机看图软件中导出的CAD图纸为什么没有颜色?
  13. 免杀神器-virtest定位特征码
  14. 计算机类教学期刊,热门大学计算机教学论文参考文献 大学计算机教学核心期刊参考文献哪里找...
  15. windows批处理修改IE主页
  16. 小游戏推广项目,适合新手操作的网路项目
  17. Tkinter 组件详解(一):Label
  18. 第一章 初识OpenHarmony
  19. 3-PHP代码审计——PHPCMSV9.6.1文件下载漏洞
  20. python之JS逆向—破解DIDI外卖wsgsig

热门文章

  1. 2016蓝桥杯省赛---java---C---10(密码脱落)
  2. 2018蓝桥杯省赛---java---B---7(螺旋折线)
  3. 2016蓝桥杯省赛---java---B---7(剪邮票)
  4. hibernate的lazy的使用
  5. 南理工计算机博士 年薪_计算机专业的女博士毕业后,进入211大学当讲师,年薪曝光...
  6. 关于es查询dsl的filter与must,term与match的区别
  7. 转移指令jmp和跳转指令call
  8. vue - resource 使用过程的坑
  9. fegin 参数丢失_许多参数和丢失的信息
  10. javaio流层次结构_流的多层次分组