初识SpringBoot

技术演进与框架对比

技术栈 核心框架 特点与局限性 替代原因
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核心优势

  1. 启动器(Starters)

    • spring-boot-starter-web:整合Tomcat + SpringMVC
    • spring-boot-starter-data-jpa:简化JPA操作
    • 原理:通过Maven依赖传递自动装配所需库(spring-boot-autoconfigure
  2. 主启动类

    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

响应处理策略

  1. 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));
    }
  2. 全局异常处理

    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在微服务中的角色

  1. 服务治理
    • 集成Spring Cloud:Eureka(服务注册发现)、Ribbon(负载均衡)、Hystrix(熔断器)
  2. 配置中心
    • spring-cloud-starter-config:集中管理多环境配置
  3. 监控端点
    • Actuator:/actuator/health/actuator/metrics 提供运行时指标

关键设计原则

  1. 控制反转(IoC)
    • 容器管理Bean生命周期(BeanFactory接口)
  2. 依赖注入(DI)
    • 实现解耦,符合单一职责原则
  3. 约定优于配置
    • 默认配置:src/main/resources/application.yml
    • 自动扫描路径:主类所在包及其子包

警示 :避免滥用@Autowired,优先使用构造函数注入保证组件不可变性和可测试性。

相关推荐
lizhongxuan12 小时前
Agent Runtime 中的 Code-driven Assembly
后端
货拉拉技术12 小时前
资损下降 99.96% 的背后: AI 资损防控平台实战
后端
用户83580861879112 小时前
撮合引擎 OrderBook 的 100ns 之路:无锁 RingBuffer + 伪共享消除,Go 1.22 下单 op 11ns
后端
用户8818630013612 小时前
用Node.js写一个简单的API请求日志中间件
后端
用户83580861879112 小时前
Go 高并发下的“内存刺客“:自研 Size-Class 无锁对象池,把 sync.Pool 的 P99 从 128μs 压到 41μs
后端
货拉拉技术12 小时前
资损下降 99.96% 的背后— AI 资损防控平台实战
后端
山水洛行14 小时前
AI Agent 智能体记忆:从检索到被治理的数据系统
后端
卷无止境15 小时前
C++20 的概念与约束:让模板编程终于"说人话"
后端
Ai拆代码的曹操15 小时前
一次排查三种连接泄漏模式,再也不怕 HikariCP 连接池爆满了
后端
人活一口气15 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot