Spring IoC中@ComponentScan配置为何导致Spring Security配置类失效
问题根本原因
@SpringBootApplication注解默认内置的组件扫描规则为:扫描启动类所在包及其所有子包下的Spring组件(包含@Configuration、@Component等注解修饰的类)。- 当你在启动类上显式添加
@ComponentScan并指定扫描包路径后,会直接覆盖Spring Boot的默认扫描规则,Spring只会扫描你显式声明的两个路径:cat.gencat.catsalut.hes.core.domain.mpi和cat.gencat.catsalut.hes.core.repository。 - 你的
WebSecurityConfiguration安全配置类不在上述两个显式指定的扫描路径下,自然不会被Spring识别加载,也就不会生效。
推荐解决方案
方案1:扩展@ComponentScan的扫描范围
将安全配置类所在的包路径追加到@ComponentScan的扫描列表中,示例代码如下:
@SpringBootApplication @ComponentScan(basePackages = { "cat.gencat.catsalut.hes.core.domain.mpi", "cat.gencat.catsalut.hes.core.repository", "你的安全配置类所在的包路径" }) public class ProjectApplication { // 启动类逻辑 }
方案2(更优):改用专用注解配置JPA扫描路径
你当前指定的两个扫描路径明显是JPA实体和Repository的存储路径,不需要用通用的@ComponentScan配置,改为使用JPA专属注解即可:
- 用
@EntityScan指定实体类扫描路径 - 用
@EnableJpaRepositories指定Repository接口扫描路径
修改后启动类示例:
@SpringBootApplication @EntityScan(basePackages = "cat.gencat.catsalut.hes.core.domain.mpi") @EnableJpaRepositories(basePackages = "cat.gencat.catsalut.hes.core.repository") public class ProjectApplication { // 启动类逻辑 }
该方案不会覆盖Spring Boot默认的组件扫描规则,安全配置类只要在启动类的包/子包下就会自动被加载,架构分层也更清晰。
方案3:强制导入安全配置类
如果不想修改扫描规则,可直接在启动类上添加@Import(WebSecurityConfiguration.class)注解,强制Spring加载该安全配置类。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

