Spring Boot框架下的注解(完整版)
1. 应用程序主配置类注解
这些注解用于定义 Spring Boot 应用的主配置类,启用自动配置,设置扫描路径等。
1.1 @SpringBootApplication
作用:@SpringBootApplication
是 Spring Boot 应用的核心注解,通常用于应用的启动类上,标识这是应用的入口。它是 @Configuration
、@EnableAutoConfiguration
和 @ComponentScan
的组合注解,整合了三个注解的功能:
@Configuration
:声明该类是一个配置类,可定义 Spring Bean 和配置项,替代传统的 XML 配置文件。@EnableAutoConfiguration
:启用自动配置,Spring Boot 会根据类路径中的依赖自动配置相关 Bean,比如有spring-boot-starter-web
时会配置 Web MVC、Tomcat 等组件。@ComponentScan
:自动扫描指定包下的所有 Bean(如@Controller
、@Service
、@Repository
等),默认扫描启动类所在包及其子包。
注意:如果要修改扫描路径,可以通过 scanBasePackages
参数指定。例如,@SpringBootApplication(scanBasePackages = "com.example")
会扫描 com.example
包及其子包。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
1.2 @Configuration
作用:将类标识为配置类,可以定义一个或多个 Bean,代替 XML 文件中的 <bean>
标签。该类中的所有 @Bean
方法会被 Spring 容器处理,方法返回的对象会被注册为 Spring Bean。
配置类在 Spring Boot 中用于组织和集中管理应用的配置,比如定义数据库、服务组件等 Bean。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
1.3 @EnableAutoConfiguration
作用:启用自动配置,使 Spring Boot 根据应用的依赖自动装配所需的 Bean。这是 Spring Boot 的核心功能之一,通过自动判断类路径中的依赖,自动配置相关的组件和基础设施,比如数据库、Web MVC 等。
注意:通常不需要单独使用,因为已包含在 @SpringBootApplication
中。可以通过 exclude
参数排除不需要的自动配置类。
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
1.4 @ComponentScan
作用:指定 Spring Boot 在启动时扫描的包路径,以自动发现和注册带 @Component
、@Service
、@Repository
等注解的类为 Bean。默认情况下,Spring Boot 会从主类所在包开始扫描;通过 @ComponentScan
可以自定义扫描路径,确保 Bean 被注册到 Spring 容器中。
@ComponentScan(basePackages = "com.example")
2. Bean 定义和依赖注入注解
这些注解用于定义 Spring Bean,控制 Bean 的创建和装配方式。
2.1 @Component
作用:将一个类声明为 Spring 管理的组件(Bean),让 Spring 自动检测和装配它。@Component
是一个通用注解,适用于任何需要被 Spring 管理的类。它是 Spring 核心容器的基础注解,@Service
、@Repository
、@Controller
都是其特化,分别用于标识不同的层次。
@Component
public class MyComponent {
}
2.2 @Service
作用:@Service
是 @Component
的一种特化,用于表示服务层的组件,通常用于编写业务逻辑或服务操作。它的语义性更强,标识了这是一个服务类,使代码的可读性和维护性更好。
@Service
public class MyService {
public String process() {
return "Processing";
}
}
2.3 @Repository
作用:@Repository
是 @Component
的特化,用于数据访问层(DAO)组件上。Spring 还会将 @Repository
标注的类中的异常封装为数据访问异常(DataAccessException
),以便统一处理持久化层的异常。
@Repository
public class MyRepository {
public List<String> findData() {
return // 查询逻辑;
}
}
2.4 @Controller
作用:@Controller
是 Spring MVC 中的控制器注解,用于将类标识为控制器,并处理 HTTP 请求。Spring 会将带 @Controller
的类作为 MVC 控制器组件来管理,这类组件主要用于返回视图页面或转发请求。
@Controller
public class MyController {
@GetMapping("/index")
public String index() {
return "index"; // 返回视图名称
}
}
2.5 @RestController
作用:@RestController
是 @Controller
和 @ResponseBody
的组合,适用于 RESTful 服务。它使得控制器类中的所有方法默认都会直接返回数据(如 JSON),而不是返回视图页面,因此简化了开发 REST API 的配置。
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
2.6 @Bean
作用:@Bean
用于定义一个方法,并将该方法的返回值注册为 Spring Bean。一般配合 @Configuration
使用,方法的名称即为 Bean 名称。可以在配置类中使用 @Bean
注解来定义第三方库中的类,或者需要通过某种复杂逻辑创建的类。
注意:@Bean
方法会被 Spring 容器代理,以确保 Bean 的单例性,即便方法被多次调用,返回的 Bean 仍然是同一个实例。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
2.7 @Autowired
作用:@Autowired
用于自动注入依赖对象。可以作用于构造器、字段或方法上,默认按类型装配(byType)。若需按名称装配,可以结合 @Qualifier
注解使用。该注解帮助自动管理对象之间的依赖关系,减少手动注入的代码量。
@Service
public class MyService {
@Autowired
private MyRepository repository;
}
2.8 @Primary
作用:在有多个同类型 Bean 的情况下,@Primary
指定默认优先使用的 Bean。适用于同类型的多个 Bean 存在且未明确指定注入对象时,通过 @Primary
确定默认选择的 Bean。
@Bean
@Primary
public MyService primaryService() {
return new MyService();
}
2.9 @Qualifier
作用:@Qualifier
用于配合 @Autowired
按名称装配 Bean,解决多 Bean 注入冲突。通常用于明确指定注入的 Bean 名称,尤其在有多个同类型 Bean 时。
@Autowired
@Qualifier("myService1")
private MyService myService;
2.10 @Value
作用:@Value
注解用于将配置文件中的属性值注入到字段、方法参数或构造器参数中。支持 SpEL 表达式,可以动态获取配置文件中的值。
@Value("${app.name}")
private String appName;
3. 生命周期相关注解
3.1 @PostConstruct
作用:标记初始化方法,在 Bean 完成依赖注入后立即执行。常用于完成 Bean 初始化工作,比如初始化某些属性或调用依赖方法。@PostConstruct
是 JSR-250 标准的生命周期注解。
@Component
public class MyComponent {
@PostConstruct
public void init() {
System.out.println("Initialization logic here");
}
}
3.2 @PreDestroy
作用:标记销毁方法,在 Bean 销毁之前执行,常用于释放资源或关闭连接。@PreDestroy
是 JSR-250 标准注解,在容器关闭之前会调用标注的方法。
@Component
public class MyComponent {
@PreDestroy
public void cleanup() {
System.out.println("Cleanup logic here");
}
}
4. 条件化配置和环境控制注解
4.1 @Conditional
作用:条件性装配 Bean,只有在指定条件为 true
时才会创建该 Bean。可用于根据环境、配置文件或其他条件来加载特定的 Bean。@Conditional
需与 Condition
接口的实现类配合使用,常见的条件化配置用于多环境管理。
@Conditional(OnPropertyCondition.class)
@Bean
public MyService myService() {
return new MyService();
}
4.2 @Profile
作用:用于基于环境配置加载特定的 Bean,可以用来加载不同环境下的配置,比如开发、测试、生产环境。在应用启动时,通过 spring.profiles.active
参数指定当前激活的环境。
@Profile("dev")
@Bean
public MyService devService() {
return new DevService();
}
5. Web 请求映射和参数注解
5.1 @RequestMapping
作用:将请求路径映射到控制器方法上,支持多种 HTTP 请求方法(如 GET、POST、PUT、DELETE)。可以用于类级别或方法级别的路径映射。@RequestMapping
可用于构建 RESTful 风格的请求。
@RequestMapping("/api")
public class ApiController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
5.2 @GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
作用:是 @RequestMapping
的简化版本,分别用于特定 HTTP 方法的请求(GET、POST、PUT、DELETE),更加简洁直观,适用于 REST API 设计。
@GetMapping("/hello")
public String hello() {
return "Hello";
}
5.3 @PathVariable
作用:用于将 URL 路径中的变量绑定到方法参数上,通常用于 RESTful API 路径中的动态参数。
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {
return userService.findById(id);
}
5.4 @RequestParam
作用:用于获取 URL 请求参数,并将其绑定到方法参数上。可设置默认值和是否为必填参数。
@GetMapping("/search")
public String search(@RequestParam("query") String query) {
return "Search result for " + query;
}
5.5 @RequestBody
作用:用于将 HTTP 请求体中的 JSON 数据直接绑定到方法参数上,常用于接收 JSON 格式的请求数据。
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.save(user);
}
6. 异步和线程池管理注解
6.1 @Async
作用:用于将方法标记为异步方法,调用时不会阻塞调用者线程,异步方法会在独立线程中执行。常用于执行耗时操作或需要异步执行的任务。
注意:需要在主类或配置类上启用 @EnableAsync
。
@Async
public void asyncMethod() {
System.out.println("Async method execution");
}
6.2 @EnableAsync
作用:启用 Spring 的异步方法支持,通常和 @Async
一起使用。添加此注解后,Spring 会自动配置异步线程池。
@SpringBootApplication
@EnableAsync
public class Application {
}
7. 缓存相关注解
7.1 @Cacheable
作用:用于将方法返回值缓存起来,提高性能。再次调用相同方法时,将直接返回缓存内容而无需再次执行方法。可以通过 key
参数指定缓存键。
@Cacheable(value = "users", key = "#id")
public User getUser(Long id) {
return userRepository.findById(id);
}
7.2 @CachePut
作用:用于更新缓存,将方法的返回值放入缓存中,通常用于保存或更新操作,使缓存数据与数据库保持一致。
@CachePut(value = "users", key = "#user.id")
public User saveUser(User user) {
return userRepository.save(user);
}
7.3 @CacheEvict
作用:用于清除缓存,可以指定清除特定缓存项或清空整个缓存。适用于删除操作或数据更新后清理无效缓存数据。
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
7.4 @EnableCaching
作用:启用 Spring 的缓存支持,使 @Cacheable
、@CachePut
和 @CacheEvict
等注解生效。通常加在主类或配置类上。
@SpringBootApplication
@EnableCaching
public class Application {
}
8. 事务管理注解
8.1 @Transactional
作用:声明方法或类的数据库操作为事务性操作,使得所有数据库操作要么全部成功,要么全部回滚。常用于业务逻辑层,确保数据一致性。事务的传播、隔离级别、回滚条件等都可以通过参数进行控制。
@Transactional
public void performTransaction() {
// 事务操作
}
8.2 @EnableTransactionManagement
作用:启用注解驱动的事务管理,通常与 @Transactional
配合使用。标注此注解后,Spring 会自动扫描 @Transactional
标注的方法并应用事务控制。
@SpringBootApplication
@EnableTransactionManagement
public class Application {
}