详解Spring Boot最核心的27个注解,你了解多少?

现在让我来详细讲解一下“详解SpringBoot最核心的27个注解,你了解多少?”的完整攻略。

引言

SpringBoot是一款优秀的Java Web开发框架,用于快速构建Web应用程序。在SpringBoot框架中,注解的使用十分重要,可以提高开发效率、提高代码可读性和可维护性。本文将详细介绍SpringBoot框架中最核心的27个注解,旨在帮助大家更好地使用SpringBoot框架。

27个核心注解

下面是27个最核心的SpringBoot注解:

1. @SpringBootApplication

这是一个核心的注解,它是一个组合注解,包含了如下三个注解:@Configuration、@EnableAutoConfiguration和@ComponentScan。这个注解通常被用于主启动类中,它表示这是一个SpringBoot应用程序的启动入口。

2. @Controller

这个注解用于标注一个类是控制器。控制器是SpringMVC框架中的核心组件之一,用于接收和处理HTTP请求。

例如:

@Controller
public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello, World!";
    }
}

在这个示例中,@Controller注解被用于标注一个HelloController类是控制器,@RequestMapping注解被用于标注一个hello方法是处理来自/hello请求的请求处理器,@ResponseBody注解被用于将方法的返回值作为响应体内容返回给客户端。

3. @RestController

这个注解用于标注一个类是RESTful风格的控制器。与@Controller不同的是,@RestController不需要在每个方法上都使用@ResponseBody注解,因为@RestController将所有方法的返回结果都默认标记为@ResponseBody。

例如:

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

在这个示例中,@RestController注解被用于标注一个HelloController类是一个RESTful风格的控制器,@GetMapping注解被用于标注一个hello方法是处理来自GET /hello请求的请求处理器。

4. @RequestMapping

这个注解用于标注一个请求处理器的方法可以接收哪些请求。

例如:

@Controller
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping("/world")
    @ResponseBody
    public String world() {
        return "Hello, World!";
    }
}

在这个示例中,这个请求处理器可以接收/hello/world请求,并通过@ResponseBody注解向客户端返回一个字符串“Hello, World!”。

5. @GetMapping/@PostMapping/@PutMapping/@DeleteMapping

这些注解是对@RequestMapping注解的封装,用于标记处理GET/POST/PUT/DELETE请求的请求处理器。

例如:

@RestController
@RequestMapping("/book")
public class BookController {
    @GetMapping("/{id}")
    public Book getBook(@PathVariable("id") Long id) {
        // TODO: 根据id获取Book对象
    }

    @PostMapping("/")
    public Book createBook(@RequestBody Book book) {
        // TODO: 创建一个新的Book对象
    }

    @PutMapping("/{id}")
    public Book updateBook(@PathVariable("id") Long id, @RequestBody Book book) {
        // TODO: 更新id指定的Book对象
    }

    @DeleteMapping("/{id}")
    public void deleteBook(@PathVariable("id") Long id) {
        // TODO: 删除id指定的Book对象
    }
}

在这个示例中,@GetMapping注解被用于标记一个getBook方法处理GET /book/{id}请求,@PostMapping注解被用于标记一个createBook方法处理POST /book请求,@PutMapping注解被用于标记一个updateBook方法处理PUT /book/{id}请求,@DeleteMapping注解被用于标记一个deleteBook方法处理DELETE /book/{id}请求。

6. @RequestParam/@PathVariable/@RequestBody

这些注解用于注入HTTP请求的参数或者请求体内容。

例如:

@RestController
@RequestMapping("/book")
public class BookController {
    @GetMapping("/search")
    public List<Book> searchBooks(@RequestParam("q") String query) {
        // TODO: 根据关键词query搜索Book对象列表
    }

    @GetMapping("/{id}")
    public Book getBook(@PathVariable("id") Long id) {
        // TODO: 根据id获取Book对象
    }

    @PostMapping("/")
    public Book createBook(@RequestBody Book book) {
        // TODO: 创建一个新的Book对象
    }

    @PutMapping("/{id}")
    public Book updateBook(@PathVariable("id") Long id, @RequestBody Book book) {
        // TODO: 更新id指定的Book对象
    }

    @DeleteMapping("/{id}")
    public void deleteBook(@PathVariable("id") Long id) {
        // TODO: 删除id指定的Book对象
    }
}

在这个示例中,@RequestParam注解被用于注入名称为q的query参数,@PathVariable注解被用于注入名称为id的URL路径参数,@RequestBody注解被用于注入HTTP请求体中的JSON数据。

7. @Configuration

这个注解用于标注一个类是Spring配置类,它会被Spring自动扫描并加载。

例如:

@Configuration
public class DataSourceConfiguration {
    @Bean
    public DataSource dataSource() {
        // TODO: 创建一个DataSource对象
    }
}

在这个示例中,@Configuration注解被用于标注一个DataSourceConfiguration类是一个Spring配置类,@Bean注解被用于标记一个dataSource方法将会返回一个DataSource对象,这个对象会被Spring自动管理和注入。

8. @EnableAutoConfiguration

这个注解用于启用SpringBoot的自动配置功能,它的作用是在SpringBoot应用程序中,根据当前项目的依赖情况自动配置和加载Bean。

例如:

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

在这个示例中,@SpringBootApplication注解包含了@EnableAutoConfiguration注解,因此SpringBoot会根据当前项目的依赖情况自动配置和加载Bean。

9. @ComponentScan

这个注解用于告诉SpringBoot扫描和加载哪些包下的组件。

例如:

@SpringBootApplication
@ComponentScan({"com.example.demo.controllers", "com.example.demo.services"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在这个示例中,@ComponentScan注解告诉SpringBoot扫描和加载com.example.demo.controllers和com.example.demo.services包下的组件。

10. @Autowired

这个注解用于注入一个Bean依赖。

例如:

@Service
public class BookService {
    @Autowired
    private BookRepository bookRepository;

    // TODO: 定义一些书籍业务方法
}

在这个示例中,@Autowired注解被用于注入一个bookRepository对象,这个对象是BookRepository接口的一个实例。

11. @Service

这个注解用于标记一个类是一个服务组件,常用于业务逻辑的处理过程中。

例如:

@Service
public class BookService {
    @Autowired
    private BookRepository bookRepository;

    // TODO: 定义一些书籍业务方法
}

在这个示例中,@Service注解被用于标记一个BookService类是一个服务组件,用于提供业务逻辑方法。

12. @Repository

这个注解用于标记一个类是一个数据仓库组件,通常用于与数据库或其他存储介质的交互过程中。

例如:

@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
}

在这个示例中,@Repository注解被用于标记一个BookRepository接口是一个数据仓库组件,它扩展自Spring Data JPA的JpaRepository接口。

13. @Transactional

这个注解用于标记一个方法是一个事务处理过程,通常用于管理数据的一致性和完整性。

例如:

@Service
public class BookService {
    @Autowired
    private BookRepository bookRepository;

    @Transactional
    public void addBook(Book book) {
        bookRepository.save(book);
    }
}

在这个示例中,@Transactional注解被用于标记一个addBook方法是一个事务处理过程,它会调用bookRepository的save方法,将一个Book对象保存到数据库中。

14. @Scheduled

这个注解用于标注一个方法需要定时执行某些逻辑,其支持cron表达式和简单时间表达式两种方式进行定时任务的配置。

例如:

@Service
public class NotificationService {
    @Scheduled(cron = "0 0 8 * * ?")
    public void sendDailyNotification() {
        // TODO: 发送每日提醒消息
    }
}

在这个示例中,@Scheduled注解被用于标注一个sendDailyNotification方法需要在每天上午8点执行某些逻辑,比如向用户发送每日提醒消息。

15. @Value

这个注解用于注入配置文件中的属性值。

例如:

book:
  title: SpringBoot入门教程
  author: 张三
  price: 39.99
@Component
public class Book {
    @Value("${book.title}")
    private String title;

    @Value("${book.author}")
    private String author;

    @Value("${book.price}")
    private double price;

    // TODO: 定义一些构造方法、属性和方法
}

在这个示例中,@Value注解被用于注入配置文件中的title、author和price属性值,这些属性值是从配置文件中读取的。

16. @Qualifier

这个注解用于注入具有多个实现的接口或者父类的具体实现类对象。

例如:

@Service
public class MyServiceProvider implements ServiceProvider {
    // TODO: 省略一些业务逻辑方法
}

@Service
public class YourServiceProvider implements ServiceProvider {
    // TODO: 省略一些业务逻辑方法
}

@Component
public class ServiceProviderConsumer {
    @Autowired
    @Qualifier("myServiceProvider")
    private ServiceProvider serviceProvider;
}

在这个示例中,ServiceProviderConsumer依赖于一个ServiceProvider接口类型的实例对象,但是这个接口有多个具体实现类,因此需要通过@Qualifier注解指定具体的实现类对象。

17. @Profile

这个注解用于标记一个类或者方法在不同的环境中使用不同的配置。

例如:

@Service
@Profile("dev")
public class MyServiceProvider implements ServiceProvider {
    // TODO: 定义一些业务逻辑方法
}

@Service
@Profile("prod")
public class YourServiceProvider implements ServiceProvider {
    // TODO: 定义一些业务逻辑方法
}

在这个示例中,MyServiceProvider适用于开发环境,YourServiceProvider适用于生产环境。

18. @Conditional

这个注解用于条件化地加载Bean,根据满足的条件不同,可以加载不同的Bean实例。

例如:

@Configuration
public class DataSourceConfiguration {
    @Bean("dataSource")
    @Conditional(DataSourceCondition.class)
    public DataSource dataSource() {
        // TODO: 创建一个DataSource对象
    }
}

public class DataSourceCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String env = context.getEnvironment().getProperty("spring.profiles.active");
        return "dev".equals(env);
    }
}

在这个示例中,DataSourceCondition实现了Condition接口,并重载了matches方法,在这个方法中,判断当前应用程序处于开发环境还是生产环境,如果当前处于开发环境,则创建一个DataSource对象并将其注入到应用程序中,否则不进行注入。

19. @ExceptionHandler

这个注解用于标记一个方法是一个异常处理器。

例如:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("errorMessage", ex.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

在这个示例中,@ExceptionHandler注解被用于标记一个handlerException方法是一个异常处理器,这个方法可以处理所有类型的异常,它会将异常消息设置为ModelAndView的一个属性值,然后将返回值设为一个视图名“error”。

20. @ControllerAdvice

这个注解用于标记一个类是全局异常处理器。

例如:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("errorMessage", ex.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

在这个示例中,@ControllerAdvice注解被用于标记一个GlobalExceptionHandler类是全局异常处理器,它会处理所有控制器中抛出的异常,并将结果返回给客户端。

21. @ResponseStatus

这个注解用于设置响应状态码。

例如:

@RestController
@RequestMapping("/book")
public class BookController {
    @GetMapping("/{id}")
    @ResponseStatus(HttpStatus.OK)
    public Book getBook(@PathVariable("id") Long id) {
        // TODO: 根据id获取Book对象
    }
}

在这个示例中,@ResponseStatus注解被用于设置响应状态码为200,表示请求已经成功完成。

22. @RequestBodyAdvice/@ResponseBodyAdvice

这些注解用于实现全局请求体和响应体的格式转换或者加密解密等操作。

例如:

@ControllerAdvice
public class RequestBodyDecryptor implements RequestBodyAdvice {
    @Override
    public boolean supports(MethodParameter methodParameter, Type type,
                              Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Object handleEmptyBody(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type,
                                   Class<? extends HttpMessageConverter<?>> aClass) {
        // TODO: 处理空请求体
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type,
                                            Class<? extends HttpMessageConverter<?>> aClass) throws IOException {
        // TODO: 对请求体进行解密
    }

    @Override
    public Object afterBodyRead(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type,
                                  Class<? extends HttpMessageConverter<?>> aClass) {
        return o;
    }
}

在这个示例中,RequestBodyDecryptor实现了RequestBodyAdvice接口,重载了接口中的四个方法,用于对请求体进行解密操作。

23. @EnableConfigurationProperties/@ConfigurationProperties

这些注解用于将配置文件中的属性值注入到Java对象中。

例如:

demo:
  name: Mike
  age: 18
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {
    private String name;
    private int age;

    // TODO: 定义一些构造方法、属性和方法
}
@Configuration
@EnableConfigurationProperties(DemoProperties.class)
public class DemoConfiguration {
}

在这个示例中,@ConfigurationProperties注解被用于将配置文件中的name和age属性注入到DemoProperties对象中,@EnableConfigurationProperties注解被用于启用ConfigurationProperties功能,它会识别DemoProperties类上的@ConfigurationProperties注解并进行扫描和处理。

24. @Async

这个注解用于标记一个方法是一个异步执行方法,它会在另外一个线程中执行指定的

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring Boot最核心的27个注解,你了解多少? - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Java如何解析html中的内容并存到数据库详解

    Java解析HTML中内容并存储到数据库的完整攻略 在Java中,我们可以使用Jsoup库来解析HTML内容,并使用Java的数据访问对象(DAO)模式将数据存储到数据库中。 1. 概述 在本篇攻略中,我们将通过抓取一个网站上的新闻列表,并将新闻内容解析并存储到数据库中的方式,介绍Java如何解析HTML中的内容并存储到数据库的完整流程。 2. 抓取和解析网…

    Java 2023年5月20日
    00
  • 详解SpringBoot工程的三种搭建方式

    我来详细讲解这个问题。首先需要注意的是,SpringBoot工程的三种搭建方式主要是指基于不同的构建工具来构建SpringBoot工程,它们分别是:Maven、Gradle和Spring Initializr。 Maven构建方式 利用Maven构建SpringBoot工程是一种非常常见的方式。具体步骤如下: 在Maven的官网下载最新版本的Maven,并安…

    Java 2023年5月15日
    00
  • java集合与数组的相同点和不同点

    Java中的数组和集合都是用来存储一组元素的数据结构,但它们在具体的使用方法、特点和功能上都有一些不同点。 相同点 都是用来存储一组元素的数据结构。 都可以通过下标或迭代器遍历其中的元素。 存储数据之前,都需要定义其具体的数据类型。 不同点 长度:Array的长度是固定的,而集合的长度可以动态地改变。 内存分配:数组的内存空间是连续的,而集合的实现方式是基于…

    Java 2023年5月26日
    00
  • Spring Session的使用示例

    下面我将为您详细讲解关于“Spring Session的使用示例”的完整攻略,包括设置和使用: 设置 1. 添加依赖 首先需要在pom.xml文件中添加spring-session的依赖: <dependency> <groupId>org.springframework.session</groupId> <art…

    Java 2023年5月26日
    00
  • J2EE中的struts2表单细节处理

    下面是详细讲解“J2EE中的struts2表单细节处理”的完整攻略: 1. Struts2表单介绍 Struts2是一个基于MVC框架的Web应用程序框架,其中处理表单是其非常重要的功能之一。Struts2使用标签库和拦截器等机制来处理Web表单,具有良好的灵活性和扩展性。 2. Struts2表单数据提交 在Struts2中,表单数据提交需要经过以下几个步…

    Java 2023年5月20日
    00
  • 详解Spring Data JPA系列之投影(Projection)的用法

    详解Spring Data JPA系列之投影(Projection)的用法 Spring Data JPA提供了很多独特的功能来帮助我们更好地访问和操作数据。其中之一就是投影(Projection)。本文将详细介绍投影的概念、用法及示例。 什么是投影? 投影是从实体类中选取所需属性并生成一个新的数据类型。这样,我们就可以只获取一部分实体的数据,而不是完整的实…

    Java 2023年5月20日
    00
  • 从实战角度详解Disruptor高性能队列

    关于”从实战角度详解Disruptor高性能队列”的完整攻略,我将从以下几个方面给出一些详细的讲解: 什么是Disruptor高性能队列? Disruptor高性能队列的优缺点 Disruptor高性能队列的基本原理 实战演示一:使用Disruptor实现高性能的消费者-生产者模型 实战演示二:使用Disruptor实现多消费者的高性能队列 什么是Disru…

    Java 2023年5月20日
    00
  • SpringMVC实现文件的上传和下载实例代码

    SpringMVC实现文件的上传和下载实例代码 在Web应用程序中,文件的上传和下载是非常常见的需求。SpringMVC提供了很多方便的方式来实现文件的上传和下载。本文将详细讲解SpringMVC实现文件的上传和下载的实例代码。 文件上传 在SpringMVC中,我们可以使用MultipartFile对象来处理文件上传。MultipartFile对象是Spr…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部