@ComponentScan
注解详解
@ComponentScan
是 Spring 框架中的一个重要注解,它的作用是 自动扫描指定包及其子包中的 Spring 组件(有 @Component
、@Service
、@Repository
、@Controller
等注解的类),并将它们注册为 Spring 容器中的 Bean。
此注解在spring项目中非常的重要,如果没有**@ComponentScan
注解**作用,我们声明的所有组件都不会生效,项目直接无法运行
在 Spring Boot 或 Spring 项目中,我们通常在主启动类上使用 @ComponentScan
可能对于新手会有一些疑惑:这个注解如此的重要为什么我没有遇到过呢,其实是因为在启动类中的@SpringBootApplication注解继承了@ComponentScan注解,找到启动类,ctrl+鼠标左键点击@ SpringBootApplication注解即可看到它继承了@ComponentScan注解,如果你没有在项目中配置过@ComponentScan注解,spring会默认从当前类所在的包开始扫描->在@ SpringBootApplication注解中配置的
但是在实际项目开发与后面学习中,往往会将项目分成不同的包来开发,比如我在此就使用三个包进行开发(为什么可以这样以后会了解,在此只讨论扫描)。
当我在common包下创建了一个类并且使用@Component将其注册到spring容器中,但是如果不进行扫描配置我在web层想要用到此类,我们就会@Autowired 然后声明此类。但是这时候你会发现,报错了,报错信息如下。这说明web包中没有扫描到对于类,也就无法将其注入容器中,自然也就无法注入到Client来进行使用,这时我们就要去启动类中来进行配置,在此我们就可以使用@ComponentScan
注解来将common包扫描进web中;
注:当我们使用@ComponentScan
注解配置后,默认的包扫描设置就会失效,所以我们也要加入自己包的扫描路径
@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 识别
}
}