避免不必要的Spring配置组件扫描
我在堆栈溢出中遇到了一个有趣的问题。 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
配置被加载两次。 它已加载:
- 在方法
AppInitializer.getRootConfigClasses()
的Servlet容器初始化期间 - 通过类
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配置组件扫描相关推荐
- spring 组件扫描_避免不必要的Spring配置组件扫描
spring 组件扫描 我在堆栈溢出中遇到了一个有趣的问题. Brett Ryan有问题,Spring Security配置被初始化了两次. 当我查看他的代码时,我发现了问题所在. 让我展示显示代码. ...
- Spring配置mapper扫描的两种方式
一, mapperLocations方式 1, spring-mybatis.xml 2, 项目结构 3, numMapper.xml 二, configLocation方式 1, spring-my ...
- Spring框架学习day_02:组件扫描 / 注解内部读解 / 组件扫描中配置作用域和生命周期 / 解耦 / 自动装配(两种方式) / 读取文件
1. 组件扫描 首先,必须让Spring扫描组件所在的包,并且,组件类的声明之前必须添加@Component注解! 其实,除了@Component注解以外,还可以使用以下注解实现同样的效果: @Con ...
- Spring过滤器组件自动扫描
在这个Spring自动组件扫描的教程,您已经了解如何使Spring自动扫描您的组件.在这篇文章中,我们将展示如何使用组件过滤器自动扫描过程. 1.过滤组件 - 包含 参见下面的例子中使用Spring ...
- spring组键扫描
<!-- 配置组件扫描 --><context:component-scan base-package="controller"/><!-- 配置MV ...
- java 扫描包框架_java – 在Android中实现类似Spring的包扫描
我正在尝试为我正在开发的 Android框架实现类似于Spring的组件扫描的包扫描功能.基本上,我希望能够指定一个基本包,例如com.foo.bar并检索具有特定注释的所有Class实例.我不想用我 ...
- Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“
1. Spring框架的作用 Spring框架的主要作用是创建对象和管理对象. 创建对象:类似于User user = new User(); 管理对象:随时可以通过Spring框架获取对象,甚至Sp ...
- Spring注解的使用之配置组件
Spring的注解式编程 配置组件(Configur Components) @Configuration @ComponentScan @Scope @Lazy @Conditional @Impo ...
- 2.3.3 spring属性注入-注解注入-全注解-配置类扫描
代码: spring2-属性注入-全注解-配置类扫描.zip - 蓝奏云文件大小:12.3 K|https://www.lanzouw.com/iPK5vvq21uf 这个博客,我们使用全注解的方式来 ...
最新文章
- 2021年大数据ELK(三):Lucene全文检索库介绍
- Spring Boot神操作-多个数据源Service层封装
- 8086存储器编址 和 I/O编址
- php 验证微信token_php之微信公众号验证token获取access_token
- python教学视频p_python接口自动化28requestshtml爬虫框架
- SQL建表公共字段脚本
- 天线越大越好吗_无线路由知识误区!解读天线数量与信号强弱的关系
- Windows Server 2012安装 .NET Framework 3.5
- 【转】AsyncTask的用法
- linux平台上不同类型的压缩文件的压缩与解压
- 负熵主义者_未来主义者
- cad导出pdf_CAD手机看图软件中导出的CAD图纸为什么没有颜色?
- 免杀神器-virtest定位特征码
- 计算机类教学期刊,热门大学计算机教学论文参考文献 大学计算机教学核心期刊参考文献哪里找...
- windows批处理修改IE主页
- 小游戏推广项目,适合新手操作的网路项目
- Tkinter 组件详解(一):Label
- 第一章 初识OpenHarmony
- 3-PHP代码审计——PHPCMSV9.6.1文件下载漏洞
- python之JS逆向—破解DIDI外卖wsgsig
热门文章
- 2016蓝桥杯省赛---java---C---10(密码脱落)
- 2018蓝桥杯省赛---java---B---7(螺旋折线)
- 2016蓝桥杯省赛---java---B---7(剪邮票)
- hibernate的lazy的使用
- 南理工计算机博士 年薪_计算机专业的女博士毕业后,进入211大学当讲师,年薪曝光...
- 关于es查询dsl的filter与must,term与match的区别
- 转移指令jmp和跳转指令call
- vue - resource 使用过程的坑
- fegin 参数丢失_许多参数和丢失的信息
- javaio流层次结构_流的多层次分组