Spring 注解配置入门指南
一、环境准备(使用 Spring Boot 简化配置)
-
创建项目步骤:
- 访问 start.spring.io
- 选择配置:Maven 项目、Java 语言、最新 Spring Boot 版本
- 添加核心依赖:
Spring Web
(包含 MVC 支持) - 生成项目后导入开发环境(IntelliJ 或 Eclipse)
-
标准项目目录结构:
src/main/java └── com/example/demo ├── DemoApplication.java # 主启动类 ├── controller # 控制器层 ├── service # 业务服务层 ├── repository # 数据持久层 └── component # 通用组件层
二、四大核心注解详解
1. @Controller
- Web 请求处理
功能:接收并处理 HTTP 请求,返回视图或数据
应用位置:控制器层 (controller
包)
示例实现:
@Controller
public class HomeController {
@GetMapping("/hello")
@ResponseBody // 直接返回响应内容
public String sayHello() {
return "Hello, Spring!";
}
}
2. @Service
- 业务逻辑封装
功能:实现核心业务逻辑处理
应用位置:服务层 (service
包)
示例实现:
@Service
public class CalculatorService {
public int add(int a, int b) {
return a + b;
}
}
3. @Repository
- 数据持久化
功能:封装数据库 CRUD 操作
应用位置:数据层 (repository
包)
示例实现:
@Repository
public class UserRepository {
public List<String> getAllUsers() {
return Arrays.asList("Alice", "Bob");
}
}
4. @Component
- 通用组件
功能:标记需要 Spring 管理的通用组件
应用位置:通用组件层 (component
包)
示例实现:
@Component
public class EmailSender {
public void sendEmail(String recipient, String content) {
System.out.println("发送邮件至 " + recipient + ":\n" + content);
}
}
三、核心配置步骤说明
1. 组件扫描配置(自动注册Bean)
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 核心配置注解:开启自动配置与组件扫描
@SpringBootApplication // 默认扫描当前包及其所有子包
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2. 依赖注入实现(组件间协同)
// Controller层调用Service示例
@Controller
public class UserController {
// 自动装配Service实例
@Autowired
private UserService userService;
@GetMapping("/users")
@ResponseBody
public List<String> getUsers() {
return userService.getAllUsers();
}
}
// Service层调用Repository和组件示例
@Service
public class UserService {
@Autowired // 注入数据访问层
private UserRepository userRepository;
@Autowired // 注入业务组件
private EmailSender emailSender;
public List<String> getAllUsers() {
// 从Repository获取数据
List<String> users = userRepository.getAllUsers();
// 调用组件发送通知邮件
emailSender.sendEmail("admin@example.com", "用户数据查询完成");
return users;
}
}
四、完整调用流程演示
-
请求处理流程:
客户端请求 → Controller层 → Service层 → Repository层 → 数据库 ↘ 业务组件(执行辅助操作)
-
实际调用示例:
// 完整业务调用演示 @Controller public class MathController { @Autowired private CalculatorService calculatorService; @GetMapping("/add") @ResponseBody public String addNumbers(@RequestParam int a, @RequestParam int b) { int result = calculatorService.add(a, b); return a + " + " + b + " = " + result; } }
访问示例:
http://localhost:8080/add?a=5&b=3
将返回结果:5 + 3 = 8
五、最佳实践与常见问题解答
1. 注解使用指南
应用场景 | 推荐注解 | 功能说明 |
---|---|---|
Web请求处理 | @Controller | 需搭配@GetMapping 等注解使用 |
REST API开发 | @RestController | 相当于@Controller +@ResponseBody 组合 |
业务逻辑层 | @Service | 通常用于事务处理 |
数据持久层 | @Repository | 自动转换异常为Spring数据异常 |
通用组件 | @Component | 适用于缓存、邮件等工具类 |
2. 依赖注入实现方式
// 方法1:字段注入(简洁但不推荐)
@Autowired
private UserService userService;
// 方法2:构造器注入(推荐首选)
private final UserService userService;
@Autowired // Spring 4.3+版本可省略
public UserController(UserService userService) {
this.userService = userService;
}
// 方法3:Setter方法注入
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
3. 常见问题解决方案
问题1:Bean注入失败(NoSuchBeanDefinitionException)
解决方案:
- 确认类是否位于启动类所在包或其子包
- 检查类是否添加了
@Controller
等注解 - 核对包扫描范围:
@SpringBootApplication(scanBasePackages="com.example")
问题2:循环依赖问题(Circular dependency)
解决方案:
- 优化代码结构,消除循环引用
- 使用
@Lazy
注解实现延迟加载:@Autowired @Lazy // 通过延迟加载解决循环依赖 private ServiceB serviceB;
六、测试验证方法
- 编写测试用例:
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class DemoApplicationTests {
@Autowired
private CalculatorService calculatorService;
@Test
void testAddition() {
assertEquals(8, calculatorService.add(5, 3));
}
}
- 执行测试:
- 在IDE中右键运行测试
- 或使用命令行:
mvn test
七、核心要点总结
-
核心注解:
@Controller
:处理Web请求@Service
:业务逻辑实现@Repository
:数据持久化操作@Component
:通用组件标识
-
运行机制:
- 组件扫描:通过
@SpringBootApplication
自动完成 - 依赖注入:使用
@Autowired
实现组件装配
- 组件扫描:通过
-
开发规范:
- 严格分层(controller/service/repository)
- 优先使用构造器注入
- 遵循单一职责原则
通过本节学习,您已掌握Spring注解开发的核心技术!这些注解可满足95%的开发需求。建议后续学习:
- 进阶内容:
@Configuration
+@Bean
配置方式- 数据访问:Spring Data JPA的
@Repository
使用- REST开发:
@RestController
高级特性