在 Spring Boot 中,扫描注解是指通过注解来告诉 Spring 框架应该扫描哪些包、哪些类或哪些特定的组件,并将其作为 Spring 容器中的 bean 进行管理。Spring Boot 主要通过以下几种注解来实现自动扫描:
@ComponentScan
@SpringBootApplication
@Component
@Service
@Repository
@Controller
这些注解的作用是告诉 Spring 容器扫描哪些类,并将它们注册为 Spring Bean。
1. @SpringBootApplication
注解
@SpringBootApplication
是一个组合注解,它包含了三个重要的注解:
@Configuration
:指示该类是一个 Spring 配置类,相当于applicationContext.xml
或@Configuration
。@EnableAutoConfiguration
:启用 Spring Boot 的自动配置机制。@ComponentScan
:启动类上通常会自动应用@ComponentScan
注解,指定 Spring Boot 扫描包的位置。
通常,你只需要使用 @SpringBootApplication
注解即可,它会自动启用组件扫描。
案例:@SpringBootApplication
启动类
java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
在这个示例中,@SpringBootApplication
会自动启用从 MyApplication
类所在包及其子包的组件扫描。
2. @ComponentScan
注解
@ComponentScan
注解是 Spring 的基础注解,用于指定 Spring 容器扫描的包。如果你不使用 @SpringBootApplication
,可以直接使用 @ComponentScan
来手动指定扫描的包。
案例:手动配置 @ComponentScan
注解
java">import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = "com.hk.services") // 指定扫描 com.hk.services 包
public class AppConfig {
}
在这个案例中,Spring 容器将只扫描 com.hk.services
包中的所有组件。
3. @Component
、@Service
、@Repository
、@Controller
注解
这些注解标记的是 Spring Bean 的不同类型。@Component
是一个通用的注解,而 @Service
、@Repository
、@Controller
是它的特化版本,分别用于标注服务层、数据访问层和控制器层的组件。
@Component
:标记一个通用的 Spring Bean。@Service
:用于标记服务层的 Bean。@Repository
:用于标记数据访问层的 Bean。@Controller
:用于标记 Web 层(Spring MVC 控制器)的 Bean。
当类上标注了这些注解后,Spring 会自动将它们注册为容器中的 Bean,并进行依赖注入。
案例:使用 @Component
和其他特化注解
java">import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Controller;@Component
public class MyComponent {public void doSomething() {System.out.println("doSomething!");}
}@Service
public class MyService {public void performService() {System.out.println("performService...");}
}@Repository
public class MyRepository {public void saveData() {System.out.println("Saving data...");}
}@Controller
public class MyController {public void handleRequest() {System.out.println(" request...");}
}
在这个例子中,MyComponent
、MyService
、MyRepository
和 MyController
都会被 Spring 容器自动扫描并注册为 Bean。
4. Spring Boot 自动配置扫描
在 Spring Boot 中,许多功能(如数据库连接、Web 配置等)是通过 自动配置 来实现的。Spring Boot 会根据类路径中的依赖自动配置相关的功能。这种自动配置的扫描也是通过 @ComponentScan
和 @EnableAutoConfiguration
完成的。
例如,如果你的项目中包含了 spring-boot-starter-web
依赖,Spring Boot 会自动启用相关的 Web 配置(如嵌入式 Tomcat 的配置)并扫描 @Controller
注解的类。
5. 组件扫描的范围
默认情况下,Spring Boot 会从主应用程序类(通常是标有 @SpringBootApplication
注解的类)所在的包及其子包开始扫描。如果你需要改变扫描的范围,可以通过 @ComponentScan
来指定其他的包。
示例:自定义扫描包的范围
java">import org.springframework.context.annotation.ComponentScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@ComponentScan(basePackages = "com.hk.custom") // 自定义扫描包
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
在这个例子中,Spring 会扫描 com.hk.custom
包及其子包中的所有 @Component
、@Service
、@Repository
、@Controller
等注解的类。
总结
@SpringBootApplication
:启用自动配置、配置类和组件扫描。@ComponentScan
:自定义扫描的包或类。@Component
、@Service
、@Repository
、@Controller
:不同类型的 Spring Bean 注解。- 自动配置:Spring Boot 自动扫描类路径中的依赖并自动配置相关组件。
这些注解通过扫描和自动装配帮助开发者轻松管理 Spring 容器中的 Bean,而不需要手动注册每个 Bean,使得开发过程更加简洁和高效。