技术演进与框架对比
技术栈 | 核心框架 | 特点与局限性 | 替代原因 |
---|---|---|---|
SSH | Struts 1.x + Spring 1.x + Hibernate | XML配置繁琐,Struts安全性差,Hibernate性能调优复杂 | 开发效率低,维护成本高 |
SSH2 | Struts 2.x + Spring 2.x + Hibernate/MyBatis | Struts2漏洞多,Hibernate学习曲线陡峭 | 安全风险,ORM灵活性不足 |
SSM | SpringMVC + Spring 3.x + MyBatis | 轻量级,MyBatis SQL可控,但XML配置仍冗余 | 需简化配置 |
SpringBoot | 内嵌Web容器 + 自动化配置 | 约定优于配置,零XML,快速启动 | 微服务时代开发效率需求 |
SpringBoot核心优势
-
启动器(Starters)
spring-boot-starter-web
:整合Tomcat + SpringMVCspring-boot-starter-data-jpa
:简化JPA操作- 原理:通过Maven依赖传递自动装配所需库(
spring-boot-autoconfigure
)
-
主启动类
java@SpringBootApplication // 组合注解:@Configuration + @EnableAutoConfiguration + @ComponentScan public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); // 启动嵌入服务器 } }
依赖注入深度优化
注入方式对比
方式 | 代码示例 | 适用场景 | 推荐度 |
---|---|---|---|
构造器注入 | public UserService(@Autowired UserRepo repo) { ... } |
强不变性,避免NPE | ★★★★★ |
Setter注入 | @Autowired public void setRepo(UserRepo repo) { ... } |
可选依赖 | ★★★☆☆ |
字段注入 | @Autowired private UserRepo repo; |
快速原型开发 | ★☆☆☆☆ |
自动装配策略
java
// 1. 按类型匹配(默认)
@Autowired
private DataSource primaryDataSource;
// 2. 按名称匹配(解决冲突)
@Autowired
@Qualifier("backupDataSource")
private DataSource secondaryDataSource;
// 3. 构造函数隐式注入(Spring 4.3+)
@Service
public class UserService {
private final UserRepo repo; // 无需@Autowired
public UserService(UserRepo repo) { this.repo = repo; }
}
注 :推荐使用
jakarta.annotation.Resource
(JSR-250标准)替代@Autowired
:
java@Resource(name = "mysqlDataSource") // 先按名称,再按类型 private DataSource dataSource;
Controller层最佳实践
路由映射优化
java
@RestController // = @Controller + @ResponseBody
@RequestMapping("/api/v1/users") // 统一前缀
public class UserController {
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public List<User> listUsers() { ... } // GET /api/v1/users
@PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity<User> createUser(@RequestParam String name) { ... }
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) { ... } // GET /api/v1/users/1001
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT) // 204状态码
public void deleteUser(@PathVariable Long id) { ... }
}
参数绑定进阶
参数类型 | 注解 | 示例 |
---|---|---|
URL路径参数 | @PathVariable |
@PathVariable("id") Long userId |
请求参数 | @RequestParam |
@RequestParam(defaultValue="0") int page |
JSON请求体 | @RequestBody |
@RequestBody UserDTO user |
请求头 | @RequestHeader |
@RequestHeader("Authorization") String token |
Cookie值 | @CookieValue |
@CookieValue("JSESSIONID") String sessionId |
响应处理策略
-
RESTful响应标准化
java@GetMapping("/{id}") public ResponseEntity<ApiResponse<User>> getUser(@PathVariable Long id) { User user = userService.findById(id); return ResponseEntity.ok() .header("Cache-Control", "max-age=3600") .body(ApiResponse.success(user)); }
-
全局异常处理
java@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(EntityNotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public ApiResponse<Void> handleNotFound(EntityNotFoundException ex) { return ApiResponse.error(404, ex.getMessage()); } }
SpringBoot在微服务中的角色
- 服务治理
- 集成Spring Cloud:Eureka(服务注册发现)、Ribbon(负载均衡)、Hystrix(熔断器)
- 配置中心
spring-cloud-starter-config
:集中管理多环境配置
- 监控端点
- Actuator:
/actuator/health
、/actuator/metrics
提供运行时指标
- Actuator:
关键设计原则
- 控制反转(IoC)
- 容器管理Bean生命周期(
BeanFactory
接口)
- 容器管理Bean生命周期(
- 依赖注入(DI)
- 实现解耦,符合单一职责原则
- 约定优于配置
- 默认配置:
src/main/resources/application.yml
- 自动扫描路径:主类所在包及其子包
- 默认配置:
警示 :避免滥用
@Autowired
,优先使用构造函数注入保证组件不可变性和可测试性。