大家好,我是G探险者。
运用springboot开发项目,我们有时分会扫除一些项目里边用不到的bean,不然的话项目发动会报错,这种状况一般是发生在什么场景里呢,以及怎么处理呢?今天我们就聊一聊。
springboot默许封装了许多的组件,而且把这些组件都进行了主动化装备封装。也就是说,只要是springboot项目,发动类在@SpringBootApplication注解下,在不需要独自装备bean的状况下,本项目所用到的bean在容器发动的时分都会被主动扫描并注入到IOC容器里。这里我所说的bean首要指的是pom文件里边装备的那些starter,以及还有一些springboot默许封装的一些组件,比方数据源,redis等一些组件。
拿数据源来说,有时分我们可能并不想运用springboot默许的数据源,该怎么办?就需要在容器发动的时分进行扫除去。
在这方面,@ComponentScan
和 @SpringBootApplication
注解提供了两种不同的方法来完成这个方针。
1. @ComponentScan 的 excludeFilters 特点
@ComponentScan
注解是用于装备包扫描的注解,其中的 excludeFilters
特点答应你扫除特定类型的组件。这在你想要细粒度地控制哪些组件被扫描时非常有用。
@Configuration
@ComponentScan(basePackages = "com.example",
excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = ExcludedClass.class))
public class YourConfigurationClass {
// Your configuration code here
}
在这个比如中,ExcludedClass
类及其子类将被扫除在组件扫描之外。
2. @SpringBootApplication 的 exclude 特点
@SpringBootApplication
是一个复合注解,它包含了 @ComponentScan
注解,一起还包含了其他元数据,比方 @EnableAutoConfiguration
,用于主动装备。通过 exclude
特点,你能够在项目的发动类上直接扫除主动装备类。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class YourSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YourSpringBootApplication.class, args);
}
}
在这个比如中,DataSourceAutoConfiguration
主动装备类将被扫除在Spring Boot应用程序的发动过程中。
3、两者的对比矩阵
特性 |
@ComponentScan 的 excludeFilters
|
@SpringBootApplication 的 exclude
|
---|---|---|
作用规模 | 指定要扫描的包,可选择性扫除特定类型的组件 | 在Spring Boot应用程序的发动类上运用,一般用于扫除主动装备类 |
扫除方法 | 运用 FilterType 指定扫除的类型,如 ASSIGNABLE_TYPE
|
直接指定要扫除的主动装备类的 Class 目标 |
适用场景 | 首要用于扫除特定类型的组件,不只限于主动装备类 | 首要用于扫除主动装备类,更契合Spring Boot的全体结构 |
示例 | java @ComponentScan(basePackages = "com.example", excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = ExcludedClass.class)) |
java @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class YourSpringBootApplication { public static void main(String[] args) { SpringApplication.run(YourSpringBootApplication.class, args); } } |
运用这两种方法,你能够根据详细需求灵敏地扫除不需要的组件或主动装备类,以定制化你的Spring Boot应用程序。
4、小结
-
一般状况下,springboot项目发动时,假如不装备扫描包途径,那么它默许是扫描和发动类同级目录下及其子目录下的@Component。
-
假如装备了扫描包途径,那么它就会在此基础上额定再去扫描装备的包途径下的@Component
-
一切遵循stater规范的依靠包starter本身并不会受制于发动类@SpringBootApplication发动类的扫描包途径的影响,由于@EnableAutoConfiguration注解(全名org.springframework.boot.autoconfigure.EnableAutoConfiguration) 主动就会扫描
-
需要独自指定扫描包途径的一般并不是一个starter,由于这些依靠或者组件包里边的@Component是散装的,没有被一个装备类统一管理,也没有被@EnableAutoConfiguration修饰过。