SpringBoot类跨包扫描失效的几种解决方法
前置问题
当我们用
@compoent
注解时,注解需要被Spring
的组件扫描扫描到。@SpringBootApplication
具有包扫描的作用 ,但是扫描范围只有当前包及其子包
列子
MvcConfig
这个配置类需要在user-service
中使用。我们启动user-service
会报扫描不到MvcConfig
这个配置类
解决办法
第一种:直接使用 @ComponentScan
组件扫描
在引用了配置类的类的启动类中使用
@ComponentScan
手动扫描
注意自己默认的扫描会被覆盖。所以要手动加入自己默认的扫描,也就是当前包及子包
因为麻烦,性能差所以不推荐
UserApplication
@ComponentScan(basePackages = {"com.hmall.common.config", "com.hmall.user"})
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
第二种:使用 @Import
直接导入
UserApplication
@Import(MvcConfig.class)
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
第三种:@Import
导入 ImportSelector
接口实现类
hm-common
中定义ImportSelector
实现类
public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] {"com.example.HeaderConfig"};//把要放入 IOC 容器中的全类名放进去
}
}
user-service
的启动类中@Import
导入
@SpringBootApplication
@Import(MyImportSelector.class)
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
第四种:直接写入 META-INF
自动配置文件
SpringBoot2
是META-INF/spring.factories
SpringBoot3
是META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
这里以 SpringBoot2
为例
META-INF/spring.factories
SpringBoot
已启动就会读取这里的列出的类。自动加载到IOC
中,即使这些配置类所在的包不在扫描范围内
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hmall.common.config.MyBatisConfig,\
com.hmall.common.config.JsonConfig,\
//这里新增了 MvcConfig
com.hmall.common.config.MvcConfig
- 我们也可以限制什么时候自动加载这个类
使用
ConditionalOnClass
。这里就是只有在SpringMVC
环境下才加载,在其他环境不加载例如响应式环境
@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInfoInterceptor());
}
}