当前位置: 首页 > news >正文

Spring常用注解介绍

Spring 框架是 Java 开发中最流行的框架之一,其核心特性之一就是通过注解(Annotation)来简化配置和开发流程。在本文中,我们将详细介绍 Spring 中最常用的注解,并解释它们的使用场景和具体用法,帮助你更好地理解和应用这些注解。


一、核心注解

1. @Component

作用:标记一个类为 Spring 组件,使其被 Spring 容器管理。
用法

@Component
public class MyComponent {// 类内容
}

说明:这是通用的组件注解,通常用于没有明确分类的类。Spring 会自动扫描并注册带有 @Component 的类。


2. @Service

作用:用于标记服务层(Service 层)的类。
用法

@Service
public class UserService {// 服务层逻辑
}

说明@Service 是 @Component 的特化形式,用于表示业务逻辑层的组件,便于代码分层管理。


3. @Repository

作用:用于标记数据访问层(DAO 层)的类。
用法

@Repository
public class UserRepository {// 数据访问逻辑
}

说明@Repository 也是 @Component 的特化形式,通常用于数据库操作。Spring 会为该类自动处理异常转换。


4. @Controller

作用:用于标记 MVC 控制层的类。
用法

@Controller
public class UserController {// 控制层逻辑
}

说明@Controller 用于处理 HTTP 请求,通常返回视图名称。在 Spring Boot 中,更常用 @RestController


5. @RestController

作用:用于标记 RESTful API 控制器。
用法

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

说明@RestController 是 @Controller 和 @ResponseBody 的组合,表示所有方法都返回 JSON 数据。


二、依赖注入注解

1. @Autowired

作用:自动装配 Bean,实现依赖注入。
用法

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;
}

说明:Spring 会自动查找并注入匹配的 Bean。默认按类型注入,如果存在多个同类型 Bean,需要配合 @Qualifier 使用。


2. @Qualifier

作用:当存在多个同类型 Bean 时,指定注入哪一个。
用法

@Service
public class UserService {@Autowired@Qualifier("userRepositoryImpl")private UserRepository userRepository;
}

说明@Qualifier 的值对应 Bean 的名称,用于解决 @Autowired 的歧义问题。


3. @Resource

作用:JSR-250 标准的依赖注入注解。
用法

@Service
public class UserService {@Resource(name = "userRepository")private UserRepository userRepository;
}

说明@Resource 默认按名称注入,如果找不到则按类型注入。与 @Autowired 不同,它不是 Spring 特有的注解。


4. @Inject

作用:JSR-330 标准的依赖注入注解。
用法

@Service
public class UserService {@Injectprivate UserRepository userRepository;
}

说明@Inject 与 @Autowired 类似,但需要额外依赖 javax.inject 包。


三、配置相关注解

1. @Configuration

作用:标记类为配置类,用于定义 Bean。
用法

@Configuration
public class AppConfig {// 配置内容
}

说明@Configuration 类通常与 @Bean 配合使用,替代传统的 XML 配置。


2. @Bean

作用:定义一个 Bean,并交给 Spring 容器管理。
用法

@Configuration
public class AppConfig {@Beanpublic UserRepository userRepository() {return new UserRepositoryImpl();}
}

说明@Bean 方法默认以方法名作为 Bean 名称,可以通过 name 属性自定义。


3. @ComponentScan

作用:指定组件扫描路径,自动注册带注解的类。
用法

@Configuration
@ComponentScan("com.example")
public class AppConfig {// 配置内容
}

说明@ComponentScan 默认扫描当前包及其子包,可以通过 basePackages 指定其他路径。


4. @Value

作用:注入配置文件中的值。
用法

@Value("${app.name}")
private String appName;

说明@Value 可以从 application.properties 或 application.yml 中读取配置值。


四、MVC 相关注解

1. @RequestMapping

作用:映射 HTTP 请求到方法。
用法

@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {// 获取用户逻辑}
}

说明@RequestMapping 可以用于类和方法,支持指定路径、HTTP 方法、请求参数等。


2. @GetMapping / @PostMapping

作用:分别用于映射 GET 和 POST 请求。
用法

@GetMapping("/users")
public List<User> getUsers() {// 获取用户列表
}@PostMapping("/users")
public User createUser(@RequestBody User user) {// 创建用户逻辑
}

说明@GetMapping 和 @PostMapping 是 @RequestMapping 的简化形式,分别对应 HTTP 的 GET 和 POST 方法。


3. @RequestParam

作用:绑定请求参数到方法参数。
用法

@GetMapping("/search")
public List<User> searchUsers(@RequestParam String name) {// 搜索用户逻辑
}

说明@RequestParam 默认要求参数必须存在,可以通过 required = false 设置为可选。


4. @PathVariable

作用:从 URL 路径中获取变量。
用法

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {// 获取用户逻辑
}

说明@PathVariable 用于 RESTful 风格的 URL,变量名需与路径中的占位符一致。


5. @RequestBody

作用:将请求体内容绑定到方法参数。
用法

@PostMapping("/users")
public User createUser(@RequestBody User user) {// 创建用户逻辑
}

说明@RequestBody 通常用于接收 JSON 或 XML 格式的请求数据。


6. @ResponseBody

作用:将方法返回值直接写入 HTTP 响应体。
用法

@GetMapping("/hello")
@ResponseBody
public String sayHello() {return "Hello, World!";
}

说明@ResponseBody 通常用于返回 JSON 或 XML 数据。在 @RestController 中默认生效。


五、事务管理

1. @Transactional

作用:声明式事务管理。
用法

@Service
public class UserService {@Transactionalpublic void updateUser(User user) {// 更新用户逻辑}
}

说明@Transactional 可以指定事务的传播行为、隔离级别等属性,默认在运行时异常时回滚。


六、AOP 相关注解

1. @Aspect

作用:标记类为切面。
用法

@Aspect
@Component
public class LoggingAspect {// 切面逻辑
}

说明@Aspect 用于定义切面类,通常与 @Component 配合使用。


2. @Before / @After / @Around

作用:定义通知类型。
用法

@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {// 前置通知逻辑}@After("execution(* com.example.service.*.*(..))")public void logAfter(JoinPoint joinPoint) {// 后置通知逻辑}@Around("execution(* com.example.service.*.*(..))")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {// 环绕通知逻辑return joinPoint.proceed();}
}

说明

  • @Before:在目标方法执行前执行。
  • @After:在目标方法执行后执行。
  • @Around:在目标方法执行前后执行,可以控制方法的执行。

七、总结

Spring 注解极大地简化了开发流程,通过合理使用这些注解,可以减少 XML 配置,提高代码的可读性和可维护性。在实际项目中,常用的注解包括:

  • 核心注解:@Component@Service@Repository@RestController
  • 依赖注入:@Autowired@Qualifier
  • 配置相关:@Configuration@Bean@Value
  • MVC 相关:@GetMapping@PostMapping@RequestParam@PathVariable
  • 事务管理:@Transactional
  • AOP 相关:@Aspect@Before@After@Around

掌握这些注解的使用场景和用法,是成为 Spring 开发专家的重要一步。希望本文对你有所帮助!


文章转载自:

http://C2aoL06Y.rhLhk.cn
http://WQ8exi2x.rhLhk.cn
http://KnJAWa5N.rhLhk.cn
http://z4gzu84e.rhLhk.cn
http://W06WMSQ5.rhLhk.cn
http://6MZuy1bL.rhLhk.cn
http://xezHlQog.rhLhk.cn
http://yaokS7cf.rhLhk.cn
http://UNdS0rOq.rhLhk.cn
http://7p4tqzez.rhLhk.cn
http://zfqvKZeG.rhLhk.cn
http://ijkmnBUe.rhLhk.cn
http://oAY0ub4h.rhLhk.cn
http://KtRCfmdx.rhLhk.cn
http://3kv10TOG.rhLhk.cn
http://qeVPHB6B.rhLhk.cn
http://quyMTG51.rhLhk.cn
http://dXzom1q2.rhLhk.cn
http://pNJtxfUj.rhLhk.cn
http://QFFBitky.rhLhk.cn
http://eFx7ekv8.rhLhk.cn
http://3bAijot6.rhLhk.cn
http://R4bjq2Yq.rhLhk.cn
http://tWpVopQz.rhLhk.cn
http://dL0LSmeB.rhLhk.cn
http://nWHlEbPm.rhLhk.cn
http://HpyblfAG.rhLhk.cn
http://hJfhwYNB.rhLhk.cn
http://hzUAn1iI.rhLhk.cn
http://dTRXsOms.rhLhk.cn
http://www.dtcms.com/a/378366.html

相关文章:

  • 《秋鳞小故事——编译器》
  • 【前端Vue】如何优雅地在vue中引入ace-editor编辑器
  • 架构深解:英伟达Rubin CPX如何通过专用预填充加速器与解耦架构重塑AI推理效率与成本
  • 线下小店悄然增长:两个关键模式与它们的运营启示
  • 开发安全利器:detect-secrets 敏感信息扫描工具实战指南
  • 中间件架构设计与实践:构建高性能分布式系统的核心基石
  • 错误于make.names(vnames, unique = TRUE): invalid multibyte string 9 使用 R 语言进行数据处理时
  • 前端基础标签
  • 深度学习基本模块:ConvTranspose2D 二维转置卷积层
  • 多模态数据治理新范式:衡石Agentic BI如何统一结构化与非结构化数据?
  • Gopeed下载器本地部署指南:cpolar实现远程任务管理
  • App 苹果 上架全流程解析 iOS 应用发布步骤、App Store 上架流程
  • unity UGUI 鼠标画线
  • ALBEF(Align Before Fuse)
  • redis 集群——redis cluster(去中心化)
  • k8s部署kafka三节点集群
  • 11.ImGui-加载字体和中文
  • 大模型推理革命
  • 项目-sqlite类的实现
  • 物联网领域中PHP框架的最佳选择有哪些?
  • ARM1.(ARM体系结构)
  • Linux开机启动设置全攻略
  • 解决Pytest参数化测试中文显示乱码问题:两种高效方法
  • PHP弱类型比较在CTF比赛中的深入分析与实战应用
  • 科大讯飞一面
  • html块标签和内联标签的通俗理解
  • 【C++】STL--Vector使用极其模拟实现
  • QT子线程与GUI线程安全交互
  • 论 Intel CPU 进化史:德承工控机全面进化 搭载新一代 Intel® Core™ Ultra 7/5/3 处理器
  • 论文阅读/博弈论/拍卖:《Truthful Auction for Cooperative Communications》