现在让我来详细讲解一下“详解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技术站