目录
11. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
今天我们来深入探讨Spring Boot中的常用注解,这些注解是简化配置、自动装配组件和实现声明式服务的关键。无论你是初学者还是有经验的开发者,掌握这些注解都将大大提高你的开发效率。本文将详细介绍每个注解的作用及其用法,并给出实际应用示例。
一、核心注解
1. @SpringBootApplication
标注在主程序类上,表示这是一个Spring Boot应用的入口。它是一个复合注解,包括了@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。(我们一般不会主动去使用它)
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. @EnableAutoConfiguration
启用Spring Boot的自动配置机制,根据添加的依赖和配置文件自动配置Spring应用。
@EnableAutoConfiguration
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
3. @Configuration
标识一个类作为配置类,相当于传统的Spring XML配置文件。可以包含一个或多个@Bean
方法。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
二、组件扫描和注入注解
4. @ComponentScan
指定要扫描的包,以便发现和注册Spring组件。默认情况下,扫描主应用类所在的包及其子包。
@ComponentScan(basePackages = "com.example")
public class MyApplication {
}
5. @Component
将一个类标识为Spring组件(Bean),可以被Spring容器自动检测和注册。通用注解,适用于任何层次的组件。
@Component
public class MyComponent {
}
6. @Service
标识服务层组件,实际上是@Component
的一个特化,用于表示业务逻辑服务
@Service
public class MyService {
}
7. @Repository
标识持久层组件(dao层),实际上是@Component
的一个特化,用于表示数据访问组件。常用于与数据库交互。
@Repository
public class MyRepository {
}
8. @Controller
标识控制层组件,实际上是@Component
的一个特化,用于表示Web控制器。处理HTTP请求并返回视图或响应数据。
@Controller
public class MyController {
}
9. @RestController
标识RESTful Web服务的控制器,实际上是@Controller
和@ResponseBody
的结合。返回的对象会自动序列化为JSON或XML,并写入HTTP响应体中。
@RestController
public class MyRestController {
}
三、数据绑定和验证注解
10. @RequestMapping
映射HTTP请求到处理方法上(支持GET、POST、PUT、DELETE等)
@Controller
public class MyController {
@RequestMapping("/hello")
public String sayHello() {
return "hello";
}
}
11. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
映射HTTP 请求到处理方法上。
@RestController
public class MyRestController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
}
@GetMapping("users")
等价于@RequestMapping(value="/users",method=RequestMethod.GET)
@PostMapping("users")
等价于@RequestMapping(value="/users",method=RequestMethod.POST)
@PutMapping("/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
@DeleteMapping("/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
12. @ResponseBody
将方法的返回值转换为指定格式(如JSON、XML)作为HTTP响应的内容返回给客户端。常用于RESTful服务中。
@RestController
public class MyRestController {
@GetMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello, World!";
}
}
13. @RequestBody
将HTTP请求体的内容(如JSON、XML)转换为Java对象。常用于接收前端传递的数据。
@RestController
public class MyRestController {
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
四、其他常用注解
14. @Autowired & @Qualifier
@Autowired
用于自动注入依赖对象;@Qualifier
用于指定注入特定名称的bean。
@Autowired
@Qualifier("baseDao")
private BaseDao baseDao;
15. @Resource
按名称装配bean,如果找不到则按类型装配。属于J2EE的注解。
@Resource(name = "baseDao")
private BaseDao baseDao;
16. @Scope
指定bean的作用域,如singleton、prototype等。
@Bean
@Scope("prototype")
public Person personPrototype() {
return new Person();
}
常见的 Spring Bean 的作用域:
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session : 每一个 HTTP Session 会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
五、组合与扩展注解
除了上述常用的单一注解外,Spring还提供了一些组合注解和扩展注解,用于更细粒度地控制应用行为。以下是几个常见的组合与扩展注解:
1. @Transactional
用于声明事务性操作,确保方法在一个事务上下文中运行。如果方法执行失败,事务将被回滚。这对于需要保证数据一致性的操作非常有用。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void registerUser(String username, String password) {
User user = new User(username, password);
userRepository.save(user); // 如果这行代码出错,事务将回滚
}
}
2. @Scheduled
用于声明定时任务,可以让方法按照指定的时间规则运行。常用于需要定期执行某些操作的场景,如数据备份、定时清理等。
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000) //每5秒执行一次该方法
public void scheduleTask() {
System.out.println("Scheduled task executed");
}
}
3. @Async
用于声明异步方法,使得该方法在一个单独的线程中执行,不会阻塞调用者。这对于耗时操作非常有用,可以提高应用的响应速度。
@Service
public class AsyncService {
@Async
public CompletableFuture<Void> doAsyncTask() {
// 模拟长时间任务,如IO操作或复杂计算
try {
Thread.sleep(5000); // 模拟耗时任务
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture(null);
}
}