Spring Boot 常见注解的用法和功能
前言
Spring Boot提供了大量注解,主要用于简化配置和开发,大致可分为核心注解、Web注解、依赖注入注解、数据访问注解、配置注解、条件注解、测试注解。
一、核心注解
- @SpringBootApplication
作用: 标注一个主程序类,表明这是一个Spring Boot 应用程序的入口
用法:通常放在主类上,一般都会用在项目启动类的主方法上
说明: 这是一个复合注解,组合了@Configuration、@EnableAutoConfiguration和@ComponentScan。
@Configuration: 标识一个类作为配置类,类似于Spring XML配置文件。
@EnableAutoConfiguration: 启用Spring Boot的自动配置机制,根据项目中的依赖和应用上下文自动配置Spring应用程序
@ComponentScan: 自动扫描指定包及其子包中的Spring组件
示例:
- @EnableAutoConfiguration
作用: Spring Boot 会根据添加的jar依赖自动配置项目
用法:只需在启动类或配置类上添加该注解即可(注意:SpringBootApplication 已经组合了这个注解所以在启动类上可以不使用)
说明: @SpringBootApplication 注解已经组合了这个注解所以在启动类上可以不使用
示例:
- @ComponentScan
作用: 自动扫描并加载符合条件的组件或者 bean,定义扫描的路径
用法:通常与 @SpringBootApplication
一起使用,无需单独添加
说明: 主要是用来扫描 bean,如果启动未加载到 bean 可以通过这个注解指定 bean 扫描加载路径(注意:这个注解也已经整合在@SpringBootApplication 注解中,所以可以不用再主类中添加这个注解)
示例:
- @Configuration
作用: @Configuration 注解
用于标识一个类是配置类
用法:直接在类上添加这个注解,一般都是配合 @bean 注解使用
说明: 表明这个类是一个java配置类
示例:
二、Web注解
- @RestController
作用: @RestController 注解结合了 @Controller 和 @ResponseBody 两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染
用法:一般直接放在控制器类上也就是我们经常见到的控制层,配合 @RequestMapping 使用
示例:
- @RequestMapping
作用: @RequestMapping 用于映射web请求(如URL路径)到具体的方法上的注解。
用法:一般直接放在控制器类上或者方法上,标注在类上时,表示类中的所有响应请求的方法都是以该类路径为父路径
示例:
- @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
作用: 分别用于映射 GET、POST、PUT、DELETE 请求到控制器方法上,
用法:放在处理特定HTTP请求的方法上
示例:
- @PathVariable
作用: 用于提取URL中的占位符变量
用法:放在方法参数上例如:@GetMapping("/users/{id}") 通过@PathVariable("id")
示例:
- @RequestBody
作用: @RequestBody
允许将客户端发送的 HTTP 请求体(如 JSON、XML 等格式的数据)映射绑定到一个对象中
用法:在控制器的处理方法中,使用 @RequestBody
标注需要接收 HTTP 请求体的参数
示例:
四、依赖注入注解
- @Autowired
作用: 自动装配 bean,也就是常说的依赖注入,通过这个注解可以将依赖对象注入进来
用法:可用在成员变量、构造方法、设置方法
示例:
- @Qualifier
作用: 区分多个 Bean 当存在多个相同类型的Bean时,@Qualifier
注解可以帮助指定具体注入哪一个,通过为Bean提供一个名称,增强了代码的可读性和可维护性
用法:@Qualifier
注解一般都是与@Autowired
注解一起使用,也可与@Primary
注解一起使用
示例:
- @
Primary
作用: 优先自动装配,在多个Bean候选者中,标记了@Primary
的Bean将被自动装配,除非使用@Qualifier
指定了其他Bean。在没有明确指定Bean的情况下,@Primary
提供了一种默认的选择
示例:
- @Inject
作用: 与@Autowired类似,用于依赖注入,也是通过字段、构造方法、方法进行注入
示例:
五、数据访问注解
- @Repository
作用:标识数据访问层组件,用于数据库操作,当一个类被标记为 @Repository
时,Spring 会为该类的所有方法自动应用事务管理。这意味着,如果方法抛出异常,Spring 将自动回滚事务
用法:放在数据访问类上
示例:
- @Service
作用:@Service
注解的类通常包含应用程序的核心业务逻辑,@Service
也可以与 Spring 的声明式事务管理结合使用,自动管理事务的边界和传播行为,使用 @Service
注解的类在 Spring 容器中是单例的,即无论多少次请求,Spring 容器都将提供相同的实例
用法:直接在业务逻辑类上使用
示例:
- @Component
作用:来标识一个类为 Spring 管理的组件。这个注解可以应用于类、接口或枚举类型上。当 Spring 容器启动时,它会扫描带有 @Component
注解的类,并为它们创建一个单例实例(默认情况下)
用法:直接在类上使用
示例:
- @ConfigurationProperties
作用:用于将配置文件中的属性绑定到一个对象上,通过置文件中的属性值自动映射到 Java 类的字段上,通过 prefix
属性指定配置文件中属性的前缀,所有以该前缀开头的属性都将绑定到该类
用法:直接在类上使用
示例:
六、配置注解
- @Configuration
作用:标记配置类,可以包含@Bean注解的方法,@Configuration
注解的配置类可以提高代码的可读性和可维护性,使得配置更加集中和模块化
用法:放在配置类上
示例:
- @Bean
作用:用于方法上,表示该方法的返回值是一个bean
用法:放在配置类的方法上
示例:
- @Import
作用:用于导入其他配置类,使可以将多个配置类组合成一个完整的配置,使得配置更加清晰和易于管理。
用法:放在配置类的方法上
示例:
- @PropertySource
作用:用于指定配置文件的位置,以指定一个或多个属性文件的路径,Spring 将加载这些文件并使其中的属性可用于注入
用法:放在配置类上
示例:
七、条件注解
- @Conditional
作用:根据条件判断是否创建bean,@Conditional
注解需要配合一个实现了 Condition
接口的类,Spring 容器在创建 Bean 之前会调用这个条件类的 matches
方法来判断是否满足条件
用法:用在@Bean注解的方法上
示例
- @Profile
作用:指定只有在特定的环境下才会注册的bean,使用 @Profile
可以指定哪些配置文件应该被激活。例如,可以有开发环境的配置和生产环境的配置。
用法:放在类或方法上
示例
八、测试注解
- @SpringBootTest
作用:用于Spring Boot测试,加载完整的应用上下文,@SpringBootTest
会启动一个 Spring 应用上下文,包括所有的 @Component
、@Service
、@Repository
和 @Controller
等
用法:放在测试类上
示例
- @DataJpaTest
作用:@DataJpaTest
仅加载与数据访问层相关的 Bean,如 @Repository
和 @Entity
用法:放在测试类上
示例
- @WebMvcTest
作用:用于Spring Boot测试,加载Web MVC的配置,@WebMvcTest
仅加载控制器层相关的 Bean,不加载服务层(Service)、数据访问层(Repository)等其他层的 Bean
用法:放在测试类上
示例
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(MyController.class) public class MyControllerTests { @Autowired private MockMvc mockMvc; @Test public void testGetItems() throws Exception { mockMvc.perform(get("/items")) .andExpect(status().isOk()) .andExpect(view().name("itemsList")) // 其他断言和测试逻辑 ; } }