详解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日

相关文章

  • Struts2 $,#,%详解及实例代码

    Struts2 $,#,% 详解及实例代码 引言 在处理 Struts2 代码时,经常可以看到一些用于处理 EL 表达式和字符串的字符,例如 $、#、% 等。这些字符在 Struts2 的开发中可以起到非常关键的作用。本文将介绍以下几个知识点: 关于 $、#、% 三个字符的作用以及使用场景 $ 和 # 在 Struts2 中的区别 $ 和 # 的示例代码 %…

    Java 2023年5月20日
    00
  • JAVAWEB实现简单的商城项目(一)实例代码解析

    首先,需要说明的是,”JAVAWEB实现简单的商城项目(一)实例代码解析”是一篇比较详细的文章,讲述了如何使用JavaWeb技术实现一个简单的商城项目,并对项目中的代码进行了详细解析。 文章总共分为以下几个部分: 1. 简介 在这个部分中,作者简要说明了本文要介绍的内容,即如何使用JavaWeb技术实现一个简单的商城项目,并说明了本文的目标读者群体以及需要具…

    Java 2023年5月19日
    00
  • 手写Java LockSupport的示例代码

    下面就手写Java LockSupport的示例代码进行详细讲解。 1. LockSupport简介 在Java中,当一个线程对某个对象的synchronized锁进行等待时,只有主动释放锁的线程或抢占了锁的线程才能解除等待;而LockSupport则是提供了一种更加灵活的线程等待/唤醒机制。LockSupport不需要使用锁和条件变量来实现线程的同步和通信…

    Java 2023年5月30日
    00
  • 利用Sharding-Jdbc进行分库分表的操作代码

    分库分表是数据库水平扩容的重要手段之一。Sharding-Jdbc是一个开源的分布式的关系型数据库中间件,它提供了比较完整的分库分表方案。下面就介绍一下如何使用Sharding-Jdbc进行分库分表的操作代码。 准备工作 在Maven中引入Sharding-Jdbc相关的依赖包。 编写Sharding-Jdbc的配置文件,配置主要包括数据源信息和分库分表等规…

    Java 2023年6月16日
    00
  • SpringBoot整合Apache Ignite的实现

    Spring Boot 整合 Apache Ignite 的过程可以分为以下几个步骤: 引入依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-core</artifact…

    Java 2023年5月19日
    00
  • SpringBoot读取资源目录中JSON文件的方法实例

    下面是关于”SpringBoot读取资源目录中JSON文件的方法实例”的完整攻略: 1.准备工作 首先需要在Spring Boot项目中创建一个资源目录,在其中添加一个JSON文件。 例如,在src/main/resources目录下创建json目录,然后在json目录下创建example.json文件,如下图所示: src/main/resources/j…

    Java 2023年5月26日
    00
  • jsp给后台带多个参数的方法

    当使用JSP进行Web开发时,传递多个参数给后台是很常见的需求。下面是详细的攻略: 一、GET方法传递多个参数 在JSP页面的form表单中设置多个参数: <form action="submit.jsp" method="get"> <label for="name">Na…

    Java 2023年6月15日
    00
  • Java编程简单应用

    Java编程简单应用攻略 如果你想学习Java编程,以下是一些简单的步骤和示例说明,可帮助你入门。 安装Java 要开始编写Java应用程序,你需要安装Java开发工具包(Java Development Kit, JDK)。你可以在Oracle官方网站下载最新版本的JDK。 下载完成后,按照安装向导完成JDK的安装。安装完成后,通过在命令行中输入以下命令来…

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