在 Java Spring Boot 中,注解是简化开发、提高效率的关键工具。以下是一些核心注解及其使用指南,按功能分类整理:
一、核心启动与配置注解
-
@SpringBootApplication
- 作用 :Spring Boot 应用的核心注解,用于标记主启动类。它是一个组合注解,等价于同时使用
@Configuration、@EnableAutoConfiguration和@ComponentScan。 - 使用场景:必须添加在 Spring Boot 应用的主启动类上,是应用启动的必要条件。
- 示例:
- 作用 :Spring Boot 应用的核心注解,用于标记主启动类。它是一个组合注解,等价于同时使用
java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Configuration
- 作用:声明当前类是一个配置类,相当于 Spring 的 XML 配置文件。
- 使用场景 :用于定义和配置 Bean,通常配合
@Bean注解一起使用。 - 示例:
java
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
// 配置并返回一个数据源 Bean
return new HikariDataSource();
}
}
-
@EnableAutoConfiguration
- 作用:启用 Spring Boot 的自动配置机制,根据类路径和配置文件中的信息自动配置 Spring 应用。
- 使用场景 :通常与
@SpringBootApplication一起使用,无需单独使用。
-
@ComponentScan
- 作用 :自动扫描指定包及其子包下的组件(如
@Component、@Service、@Repository、@Controller等),并将它们注册为 Spring Bean。 - 使用场景 :通常与
@SpringBootApplication一起使用,无需单独使用。若需自定义组件扫描范围,可通过basePackages属性指定。 - 示例:
- 作用 :自动扫描指定包及其子包下的组件(如
java
@SpringBootApplication(scanBasePackages = "com.example.demo")
public class DemoApplication {
// ...
}
二、组件注册注解
-
@Component
- 作用:通用的组件注解,用于标记任何类为 Spring 的组件。Spring 会自动扫描并创建该类的实例。
- 使用场景 :当组件不属于
Controller、Service、Repository等特定层级时使用。 - 示例:
java
@Component
public class ToolUtil {
public String formatStr(String str) {
return str.trim().toUpperCase();
}
}
@Service
- 作用 :标记业务逻辑层(Service 层)的组件,是
@Component的特化版本,语义更加明确。 - 使用场景:用于封装核心业务逻辑。
- 示例:
java
@Service
public class UserService {
public User getUserById(Integer id) {
// 实际场景中会调用 Repository 层查询数据库
User user = new User();
user.setId(id);
user.setName("李四");
return user;
}
}
@Repository
- 作用 :标记数据访问层(DAO 层)的组件,是
@Component的特化版本。除了将类注册为 Bean 外,它还额外提供了持久化异常转换的功能。 - 使用场景:用于封装数据访问逻辑,与数据库交互。
- 示例:
java
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
User findByName(String name);
}
@Controller
- 作用:标记控制层组件,用于接收 HTTP 请求并返回视图或数据。
- 使用场景:Web 层控制器类,处理用户请求(如页面跳转、表单提交等)。
- 示例:
java
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/info")
public String userInfo(Model model) {
model.addAttribute("username", "张三");
return "user-info"; // 返回视图名
}
}
@RestController
- 作用 :组合注解,相当于
@Controller+@ResponseBody。用于构建 RESTful API,返回 JSON/XML 等数据格式,而非视图。 - 使用场景:前后端分离项目的接口层,提供 RESTful API(如移动端接口、前端 AJAX 请求接口)。
- 示例:
java
@RestController
@RequestMapping("/api/user")
public class UserRestController {
@GetMapping("/info")
public User getUserInfo() {
User user = new User();
user.setId(1);
user.setName("张三");
return user; // 直接返回 User 对象,会自动转为 JSON
}
}
三、依赖注入注解
-
@Autowired
- 作用:自动注入依赖的 Bean,Spring 会在 IoC 容器中查找匹配类型的 Bean 并注入到目标字段、构造方法或 setter 方法中。
- 使用场景:需要注入其他 Bean 依赖时(如 Service 层注入 Repository 层、Controller 层注入 Service 层)。
- 示例:
java
@RestController
public class UserRestController {
private final UserService userService;
@Autowired
public UserRestController(UserService userService) {
this.userService = userService;
}
@GetMapping("/info")
public User getUserInfo() {
return userService.getUserById(1);
}
}
@Qualifier
- 作用 :与
@Autowired一起使用,用于指定要注入的 Bean 的名称。当存在多个相同类型的 Bean 时,可以使用@Qualifier来指定注入哪一个。 - 使用场景:解决相同类型 Bean 的歧义性注入问题。
- 示例:
java
@RestController
public class UserRestController {
private final UserService userService;
@Autowired
@Qualifier("userServiceImpl") // 指定注入的 Bean 名称
public UserRestController(UserService userService) {
this.userService = userService;
}
// ...
}
@Value
- 作用 :注入配置文件中的值,可以注入
String、int、long、double、boolean等类型。 - 使用场景:从配置文件中读取配置值并注入到 Bean 的属性中。
- 示例:
java
@Component
public class AppConfig {
@Value("${server.port}")
private int port;
// ...
}
四、Web 开发注解
-
@RequestMapping
- 作用:映射 HTTP 请求到处理方法,可以用于类和方法上。用于指定请求 URL 和 HTTP 方法(GET、POST、PUT、DELETE 等)。
- 使用场景:处理 Web 请求,将请求映射到具体的处理方法上。
- 示例:
java
@RestController
@RequestMapping("/api/user")
public class UserRestController {
@GetMapping("/info")
public User getUserInfo() {
// ...
}
@PostMapping("/create")
public User createUser(@RequestBody User user) {
// ...
}
}
@GetMapping 、@PostMapping 、@PutMapping 、@DeleteMapping
- 作用 :分别用于映射 HTTP GET、POST、PUT、DELETE 请求到处理方法上。它们是
@RequestMapping的特化,分别对应不同的 HTTP 请求方法。 - 使用场景:简化 RESTful API 的开发,直接对应 HTTP 方法。
- 示例:
java
@RestController
@RequestMapping("/api/user")
public class UserRestController {
@GetMapping("/info")
public User getUserInfo() {
// ...
}
@PostMapping("/create")
public User createUser(@RequestBody User user) {
// ...
}
}
@RequestParam
- 作用:用于将请求参数绑定到 Controller 方法的参数上。
- 使用场景:获取 URL 查询参数或表单提交的参数。
- 示例:
java
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String name, @RequestParam(defaultValue = "10") int size) {
// ...
}
@PathVariable
- 作用:用于获取请求路径中的参数,通常用于 RESTful 风格的 API 上。
- 使用场景:从 URL 路径中提取参数值。
- 示例:
java
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Long id) {
// ...
}
@RequestBody
- 作用:用于接收请求体中的 JSON 数据,并将其绑定到 Controller 方法的参数上。
- 使用场景:处理 POST、PUT 等请求中的 JSON 数据。
- 示例:
java
@PostMapping("/create")
public User createUser(@RequestBody User user) {
// ...
}
@ResponseBody
- 作用 :表示该方法的返回结果直接写入 HTTP 响应体中,返回数据的格式为
application/json。通常与@Controller一起使用,若使用@RestController则无需使用此注解。 - 使用场景:返回 JSON/XML 等数据格式,而非视图。
- 示例:
java
@Controller
public class UserController {
@GetMapping("/info")
@ResponseBody
public User getUserInfo() {
User user = new User();
user.setId(1);
user.setName("张三");
return user;
}
}
