深圳专业建站多少钱线上渠道推广
前置问题
当我们用
@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.factoriesSpringBoot3是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,\//这里新增了 MvcConfigcom.hmall.common.config.MvcConfig
- 我们也可以限制什么时候自动加载这个类
使用
ConditionalOnClass。这里就是只有在SpringMVC环境下才加载,在其他环境不加载例如响应式环境
@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());}
}
