@ComponentScan注解详解

@ComponentScan 注解详解

@ComponentScan 是 Spring 框架中的一个重要注解,它的作用是 自动扫描指定包及其子包中的 Spring 组件(有 @Component@Service@Repository@Controller 等注解的类),并将它们注册为 Spring 容器中的 Bean

此注解在spring项目中非常的重要,如果没有**@ComponentScan 注解**作用,我们声明的所有组件都不会生效,项目直接无法运行


在 Spring Boot 或 Spring 项目中,我们通常在主启动类上使用 @ComponentScan

可能对于新手会有一些疑惑:这个注解如此的重要为什么我没有遇到过呢,其实是因为在启动类中的@SpringBootApplication注解继承了@ComponentScan注解,找到启动类,ctrl+鼠标左键点击@ SpringBootApplication注解即可看到它继承了@ComponentScan注解,如果你没有在项目中配置过@ComponentScan注解,spring会默认从当前类所在的包开始扫描->在@ SpringBootApplication注解中配置的

image-20250304160817275

但是在实际项目开发与后面学习中,往往会将项目分成不同的包来开发,比如我在此就使用三个包进行开发(为什么可以这样以后会了解,在此只讨论扫描)。

image-20250304161346880

当我在common包下创建了一个类并且使用@Component将其注册到spring容器中,但是如果不进行扫描配置我在web层想要用到此类,我们就会@Autowired 然后声明此类。但是这时候你会发现,报错了,报错信息如下。这说明web包中没有扫描到对于类,也就无法将其注入容器中,自然也就无法注入到Client来进行使用,这时我们就要去启动类中来进行配置,在此我们就可以使用@ComponentScan注解来将common包扫描进web中;

当我们使用@ComponentScan注解配置后,默认的包扫描设置就会失效,所以我们也要加入自己包的扫描路径

image-20250304162005859

@SpringBootApplication
@EnableAsync//启动异步知识
//扫描sms包下的类,对应类下配置的Bean可以被注入到app项目中
@ComponentScan(basePackages = {"com.zhang.lease.common.**","com.zhang.lease.web.app.**"})
public class AppWebApplication {
    public static void main(String[] args) {
        SpringApplication.run(AppWebApplication.class);
    }
}

** @ComponentScan 的属性**

@ComponentScan 注解提供了多个可配置的属性,常见的有:在此只学习一个满足日常使用

2.1 basePackages(推荐使用)

指定要扫描的包路径,可以是一个或多个包。

@ComponentScan(basePackages = {"com.example.service", "com.example.repository"})

如果 @ComponentScan 被手动指定,Spring 只会扫描指定的包,不会扫描默认包。

请注意@ComponentScan不能扫描@Bean`

  • @ComponentScan 只会扫描 @Component@Service@Repository@Controller 标注的类,不会扫描 @Bean 方法创建的 Bean
  • @Bean 方法必须写在 @Configuration 类中,并由 @ComponentScan 扫描到这个 @Configuration 才能生效。

错误示例:

@ComponentScan(basePackages = "com.example.service")
public class AppConfig {
    
    @Bean
    public MyBean myBean() {
        return new MyBean();  // 这个 Bean 可能不会被扫描到
    }
}

正确示例(应该使用 @Configuration):

@Configuration
@ComponentScan(basePackages = "com.example.service")
public class AppConfig {

    @Bean
    public MyBean myBean() {
        return new MyBean();  // 这样才会被 Spring 识别
    }
}

yBean myBean() {
return new MyBean(); // 这样才会被 Spring 识别
}
}


@ComponentScanSpring框架中的注解之一,用于指定要扫描的包及其子包,以自动注册Spring容器中的Bean。它的作用是告诉Spring在指定的包中查找带有@Component注解(或其他特定注解)的类,并将其实例化为Bean,并加入到Spring容器中统一管理。 @ComponentScan可以用在@Configuration注解的类上,也可以用在普通的@Component注解的类上。当用在@Configuration注解的类上时,它会扫描指定包下的所有类并注册为Bean;当用在普通的@Component注解的类上时,它会扫描指定包下的所有类并将其作为普通Bean进行注册。 @ComponentScan可以接收一个或多个参数,常见的参数如下: - basePackages:指定要扫描的包路径,可以使用字符串数组指定多个包。例如:@ComponentScan(basePackages = {"com.example.package1", "com.example.package2"}) - basePackageClasses:指定要扫描的类所在的包,Spring会根据这些类所在的包路径进行扫描。例如:@ComponentScan(basePackageClasses = {Class1.class, Class2.class}) - includeFilters:指定要包含的过滤条件,只有符合条件的类才会被注册为Bean。例如:@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = MyAnnotation.class)) - excludeFilters:指定要排除的过滤条件,符合条件的类不会被注册为Bean。例如:@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = MyExcludeClass.class)) 除了上述常见的参数外,还可以使用其他参数来进一步细化扫描的范围和条件。通过灵活配置@ComponentScan注解,我们可以方便地进行自动扫描和注册Bean,减少手动配置的工作量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值