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

相关推荐
用户47949283569156 分钟前
你每天都在用的 JSON.stringify ,V8 给它开了“加速通道”
前端·chrome·后端
派大鑫wink11 分钟前
【Day7】构造方法与 this 关键字:初始化对象的正确姿势
java·开发语言
JIngJaneIL12 分钟前
基于java+ vue办公管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
uzong16 分钟前
如何将项目做出 owner 的感觉
后端
超级大只老咪19 分钟前
速通:类,对象,方法(Java)
java
毕设源码-郭学长21 分钟前
【开题答辩全过程】以 基于SpringBoot的企业销售合同管理设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
while(1){yan}21 分钟前
JVM八股文
java·开发语言·jvm·java-ee
jiayong2322 分钟前
Spring AI Alibaba 深度解析(一):框架概述与核心功能
java·人工智能·spring
AAA简单玩转程序设计22 分钟前
Java 异常处理:3 个 “避坑神操作”,告别崩溃式报错
java
徐老总23 分钟前
圆形(Circle)和矩形(Rectangle)两个样例类
java