深入理解 Spring Boot 注解:核心功能与高级用法详解

简介: 深入理解 Spring Boot 注解:核心功能与高级用法详解

深入理解 Spring Boot 注解:核心功能与高级用法详解

Spring Boot 是一种用来简化新 Spring 应用的初始搭建及开发过程的框架,采用大量注解来减少配置和加速开发。本文将详细介绍 Spring Boot 常用的注解及其应用,帮助开发者更好地理解和使用这些注解,从而提升开发效率。

1. 核心注解

@SpringBootApplication:这是一个组合注解,包含以下三个注解的功能:

  • @Configuration:标记一个类为配置类,用于定义 Spring Bean。
  • @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制,根据项目中的依赖自动配置 Spring 应用程序。
  • @ComponentScan:指定扫描的包,用于发现和注册 Spring 组件。
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2. 配置类相关注解

@Configuration:标记一个类为配置类,用于定义 Spring Bean

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@Bean:用于定义一个 Bean,在配置类中使用。

@Bean
public DataSource dataSource() {
    return new HikariDataSource();
}

3. 自动配置注解

@EnableAutoConfiguration:启用 Spring Boot 的自动配置机制,根据项目中的依赖自动配置 Spring 应用程序。

@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@ConditionalOnClass:当类路径中存在指定的类时,配置生效。

@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceConfig {
    // 配置数据源
}

@ConditionalOnMissingBean:当容器中不存在指定 Bean 时,配置生效。

@Bean
@ConditionalOnMissingBean
public MyService myService() {
    return new MyServiceImpl();
}

4. 组件扫描和注入相关注解

@ComponentScan:指定扫描的包,用于发现和注册组件。

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

@Component:通用组件注解,用于标记一个类作为 Spring 管理的 Bean。

@Component
public class MyComponent {
}

@Service:标记一个类为服务层组件,功能上等同于 @Component,但在语义上更明确。

@Service
public class MyService {
}

@Repository:标记一个类为数据访问层组件,功能上等同于 @Component,并支持异常转换。

@Repository
public class MyRepository {
}

@Controller:标记一个类为 Spring MVC 控制器,功能上等同于 @Component。

@Controller
public class MyController {
}

@RestController:组合注解,包含 @Controller 和 @ResponseBody,用于创建 RESTful Web 服务。

@RestController
public class MyRestController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

@Autowired:自动注入 Bean,可以用在构造器、方法、属性上。

@Autowired
private MyService myService;

@Qualifier:与 @Autowired 一起使用,用于区分多个候选 Bean。

@Autowired
@Qualifier("myServiceImpl")
private MyService myService;

@Primary:当有多个同类型 Bean 时,标记一个 Bean 为首选 Bean。

@Bean
@Primary
public MyService myService1() {
    return new MyServiceImpl1();
}

5. 配置属性相关注解

@Value:注入属性值,可以从配置文件或环境变量中读取。

@Value("${app.name}")
private String appName;

@ConfigurationProperties:将属性文件中的配置映射到一个 Java 类中。

@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private int port;
    // getters and setters
}

6. Web相关注解

@RequestMapping:用于映射请求 URL 到处理方法上,可以用在类和方法上。

@RequestMapping("/home")
public String home() {
    return "home";
}

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping:分别用于映射 GET、POST、PUT、DELETE 请求。

@GetMapping("/user")
public String getUser() {
    return "user";
}

@PathVariable:用于获取 URL 中的路径变量。

@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") Long id) {
    return "User ID: " + id;
}

@RequestParam:用于获取 URL 中的请求参数。

@GetMapping("/search")
public String search(@RequestParam("q") String query) {
    return "Search Query: " + query;
}

@RequestBody:用于处理请求体中的数据。

@PostMapping("/user")
public String createUser(@RequestBody User user) {
    return "User created";
}

@ResponseBody:表示返回值是响应体的一部分,而不是视图名。

@GetMapping("/hello")
@ResponseBody
public String hello() {
    return "Hello, World!";
}

@RestControllerAdvice:用于定义全局异常处理、数据绑定等,作用于所有@RestController 注解的类。

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }
}

7. 异步和事件处理相关注解

@Async:标记方法为异步执行。

@Async
public void asyncMethod() {
    // 异步执行的代码
}

@EnableAsync:开启异步支持。

@EnableAsync
@SpringBootApplication
public class Application {
}

@EventListener:标记方法为事件监听器。

@EventListener
public void handleEvent(ApplicationEvent event) {
    // 处理事件
}

@EnableScheduling:开启定时任务支持。

@EnableScheduling
@SpringBootApplication
public class Application {
}

@Scheduled:定义定时任务。

@Scheduled(fixedRate = 5000)
public void scheduledTask() {
    // 定时执行的代码
}


通过掌握这些 Spring Boot 注解及其使用方法,可以有效简化 Spring Boot 应用的开发和配置,提高开发效率。

目录
相关文章
|
3天前
|
SQL Java 调度
实时计算 Flink版产品使用问题之使用Spring Boot启动Flink处理任务时,使用Spring Boot的@Scheduled注解进行定时任务调度,出现内存占用过高,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
|
10天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的多功能智能手机阅读APP附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的多功能智能手机阅读APP附带文章源码部署视频讲解等
13 1
|
6天前
|
XML Java 关系型数据库
面试一口气说出Spring的声明式事务@Transactional注解的6种失效场景
面试一口气说出Spring的声明式事务@Transactional注解的6种失效场景
|
7天前
|
Java 微服务 Spring
【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别
【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别
|
14天前
|
Java 微服务 Spring
微服务04---服务远程调用,根据订单id查询订单功能,根据id查询订单的同时,把订单所属的用户信息一起返回,Spring提供了一个工具RestTemplate,Bean写在对象前面,以后可以在任何地
微服务04---服务远程调用,根据订单id查询订单功能,根据id查询订单的同时,把订单所属的用户信息一起返回,Spring提供了一个工具RestTemplate,Bean写在对象前面,以后可以在任何地
|
14天前
|
存储 Java
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
|
14天前
|
Java 文件存储
软件开发常用之SpringBoot文件上传和下载功能(上){fileName},利用hutool提供的依赖,拿到当前目录的路径,System.getProperty从变量获取路径 ,不存在就用mkdi
软件开发常用之SpringBoot文件上传和下载功能(上){fileName},利用hutool提供的依赖,拿到当前目录的路径,System.getProperty从变量获取路径 ,不存在就用mkdi
|
15天前
|
Java 测试技术 数据安全/隐私保护
Spring Boot中的自定义注解应用
Spring Boot中的自定义注解应用
|
Java 应用服务中间件 Maven
深入SpringBoot核心注解原理(下)
深入SpringBoot核心注解原理(下)
深入SpringBoot核心注解原理(下)