大家好,我是G探险者。

运用springboot开发项目,我们有时分会扫除一些项目里边用不到的bean,不然的话项目发动会报错,这种状况一般是发生在什么场景里呢,以及怎么处理呢?今天我们就聊一聊。

springboot项目发动时怎么扫除一个bean?

springboot默许封装了许多的组件,而且把这些组件都进行了主动化装备封装。也就是说,只要是springboot项目,发动类在@SpringBootApplication注解下,在不需要独自装备bean的状况下,本项目所用到的bean在容器发动的时分都会被主动扫描并注入到IOC容器里。这里我所说的bean首要指的是pom文件里边装备的那些starter,以及还有一些springboot默许封装的一些组件,比方数据源,redis等一些组件。

拿数据源来说,有时分我们可能并不想运用springboot默许的数据源,该怎么办?就需要在容器发动的时分进行扫除去。

springboot项目发动时怎么扫除一个bean?

在这方面,@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、两者的对比矩阵

特性 @ComponentScanexcludeFilters @SpringBootApplicationexclude
作用规模 指定要扫描的包,可选择性扫除特定类型的组件 在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、小结

  1. 一般状况下,springboot项目发动时,假如不装备扫描包途径,那么它默许是扫描和发动类同级目录下及其子目录下的@Component。

  2. 假如装备了扫描包途径,那么它就会在此基础上额定再去扫描装备的包途径下的@Component

  3. 一切遵循stater规范的依靠包starter本身并不会受制于发动类@SpringBootApplication发动类的扫描包途径的影响,由于@EnableAutoConfiguration注解(全名org.springframework.boot.autoconfigure.EnableAutoConfiguration) 主动就会扫描

  4. 需要独自指定扫描包途径的一般并不是一个starter,由于这些依靠或者组件包里边的@Component是散装的,没有被一个装备类统一管理,也没有被@EnableAutoConfiguration修饰过。