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

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配置被加载两次。 它已加载:

  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 组件扫描

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

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

相关文章

php滚动到指定位置,JQuery插件:ScrollTo平滑滚动到页面指定位置

ScrollTo是一款基于jQuery的滚动插件&#xff0c;当点击页面的链接时&#xff0c;可以平滑地滚动到页面指定的位置。适用在一些页面内容比较多&#xff0c;页面长度有好几屏的场合&#xff0c;本文以DEMO为示例讲解该插件的应用。查看演示DEMO使用方法1&#xff0d;准备jQuery库…

聚集索引和非聚集索引的区别_武汉无疫情小区居民可在小区内非聚集性个人活动...

3月18日&#xff0c;武汉市新冠肺炎疫情防控指挥部社区疫情防控组发布《关于无疫情小区、村(队)调整管控措施的意见》(下简称《意见》)指出&#xff0c;全市认定的无疫情小区、村(队)可对管控措施作有序调整。 被认定为无疫情小区的&#xff0c;允许居民分批、分时段、分楼栋&a…

C语言 | 指向指针的指针排序

C语言实现用指向指针的指针的方法对5个字符串排序并输出。 解题思路&#xff1a;读者看着道题的时候&#xff0c;首先要知道什么时指针&#xff0c;指向指针的指针应该怎么用&#xff0c;一般在开发中不这样用&#xff0c;读者要看明白&#xff0c;这个很锻炼思维的。C语言源代…

jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表

jooq sql最近&#xff0c;我们已经展示了Java 8和函数式编程将如何为使用jOOQ和Java 8 lambda和Streams进行SQL数据的函数数据转换为Java开发人员带来新的视角。 今天&#xff0c;我们将这一步骤更进一步&#xff0c;将数据转换为JavaFX XYChart.Series以根据数据生成美观的条形…

python 接收邮件服务器地址_Python 用IMAP接收邮件

一、简介IMAP(Internet Message Access Protocol)&#xff0c;这个协议与POP一样&#xff0c;也是从邮件服务器上下载邮件到本机&#xff0c;不过IMAP比POP的功能要更加强大些&#xff0c;IMAP除支持POP所有功能外&#xff0c;还支持以下功能&#xff1a;多个邮件文件夹(收件箱…

流媒体服务器 php,nginx 流媒体服务器 FFmpeg 截图

预备:yum install -y automake autoconf libtool gcc gcc-c1.安装phpyum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc php-devel php-fpm2.安装 nginxyum –y install nginx nginx-devel3.安装FFmpeg安装 Install ffmpeg 等模块yum -y install ffmpe…

C语言应用笔记:C语言typedef关键字及其使用

C 语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称&#xff0c;来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称&#xff0c;就可以在该程序中用自己的…

java不支持发行版本12_主要发行版本后Java开发人员应使用的15种工具

java不支持发行版本12新部署的生存工具包&#xff1a;适用于Java开发人员的工具&#xff0c;这些工具经常将代码部署到生产中&#xff01; Takipi会检测生产中的所有错误&#xff0c;并像发生错误时一样显示变量值 立即部署并获得免费的T恤 新部署的终极生存套件 与在僵尸末…

php get raw,file_get_contents(“php:// input”)或$ HTTP_RAW_POST

慕用2447696file_get_contents(php&#xff1a;// input) - 获取原始POST数据&#xff0c;你需要在编写API时使用它&#xff0c;并且需要XML / JSON / ...输入&#xff0c;这些输入无法通过PHP解码为$ _POST 一些例子&#xff1a;通过邮寄JSON字符串发送function fn(){var js_o…

绑定dictionary 给定关键字不再字典中_对字典嵌套的理解及二级下拉菜单的制作...

大家好&#xff0c;今日我们继续讲解VBA数组与字典解决方案&#xff0c;今日讲解第51讲&#xff1a;对字典嵌套的理解及二级下拉菜单的制作.在讲字典的时候,我反复说明,字典看视非常简单,由于它具有直达性可以省略去我们大量的循环查找代码,所以使用起来要特别留意很多用法和常…

C语言小笔记

C99标准下可以指定结构体的成员初始化。typedef struct{int a;int b; } Test;Test test {.a 10, .b 15};C99标准下可以指定数组下标初始化。int a[5] { [2] 5, 6, [4] 7 };方便的数据打印。打印一个整型值数据&#xff1a;int count 10; printf("count %d\n"…

lua中keyvalue_40行中的持久性KeyValue Server和一个可悲的事实

lua中keyvalue再次出现。..彼得斯撰写了有关Unsafe用法的书面概述 &#xff0c;我将简要介绍一下Java中的低级技术如何通过启用更高级别的抽象或允许Java性能级别来节省开发工作可能很多人都不知道。 我的主要观点是表明&#xff0c;将对象转换为字节&#xff0c;反之亦然是一…

C++基础教程示例详解:C++中的I/O重定向

在C语言中&#xff0c;我们可以使用函数freopen()将现有文件指针重定向到另一个流。freopen()的原型如下FILE * freopen ( const char * filename, const char * mode, FILE * stream );例如&#xff0c;要将stdout重定向为文本文件&#xff0c;我们可以编写freopen ("tex…

租房界的php,php实现出租房数据管理及搜索页面

这篇文章主要为大家详细介绍了php出租房数据管理及搜索页面的相关资料&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下php数据访问例子&#xff1a;租房信息管理&#xff0c;具体内容如下1.数据库建表2. zufangzi.php租房子区域&#xff1a;全选requi…

ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...

前面给大家讲过&#xff0c;函数是一种编程思想&#xff0c;是提高代码重复利用的设计思路&#xff0c;是代码设计更深层次的产物。今天要给大家讲的就是函数的核心&#xff1a;函数的参数基本概念1、函数的参数&#xff1a;是指函数完成某项功能所需要的信息。举个例子&#x…

centos7.4编译mysql5.6,centos7编译安装mysql5.6

1.useradd -s /sbin/nologin -M mysql #新增mysql运行用户2.yum -y install ncurses-devel libaio-devel cmake gcc-c #安装依赖包3.编译&#xff0c;注&#xff1a;重新cmake需要删除CMakeCache.txt文件cmake -DCMAKE_INSTALL_PREFIX/zhonghong/mysql \-DMYSQL_DATADIR/zhong…

面向对象设计思想-C语言

面向对象的三个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态。但是C语言不是面向对象编程语言&#xff0c;所以需要借助一些技巧来实现这三个特征&#xff1a;&#xff08;1&#xff09;C语言没有成员函数&#xff0c;struct只能封装数据&#xff0c;不能封装方法&am…

java iterable_太糟糕了,Java 8没有Iterable.stream()

java iterable这是最近比较有趣的Stack Overflow问题之一&#xff1a; 为什么Iterable不提供stream&#xff08;&#xff09;和parallelStream&#xff08;&#xff09;方法&#xff1f; 最初&#xff0c;直接将Iterable转换为Stream似乎很直观&#xff0c;因为在90&#xff…

three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发

Three.js、ThingJS这些引擎库可以加载3D制作软件的模型&#xff0c;大幅度提高了制作效率&#xff0c;改变WebGL开发困难的局面&#xff0c;让Web开发者享受便捷的3D开发服务。三者的难度对比如下&#xff1a;ThingJS&#xff08;框架&#xff09;< Three.js&#xff08;引擎…

C语言 | typedef

C语言typedef用新的类型名代替原有的类型名//指定用Integer为类型名&#xff0c;作用与int相同。 typedef int Integer&#xff1b;//指定用Real为类型名&#xff0c;作用与float相同。 typedef float Real&#xff1b;C语言允许程序设计者用一个简单的名字代替复杂的类型形式命…