初识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,优先使用构造函数注入保证组件不可变性和可测试性。

相关推荐
Mahir081 天前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
RyFit1 天前
SpringAI 常见问题及解决方案大全
java·ai
石山代码1 天前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事1 天前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海1 天前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠1 天前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
德思特1 天前
从 Dify 配置页理解 RAG 的重要参数
java·人工智能·llm·dify·rag
YOU OU1 天前
Spring IoC&DI
java·数据库·spring
один but you1 天前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
IT_陈寒1 天前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端