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

相关推荐
遗憾皆是温柔1 分钟前
3.JVM,JRE和JDK的关系是什么
java·开发语言·jvm·面试
M1A12 分钟前
全球语言无障碍:Unicode标准解读与技术演进史
后端
无限大610 分钟前
多数元素问题:从暴力美学到摩尔投票神仙解法
后端
无限大626 分钟前
《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
后端
洛可可白32 分钟前
Spring Boot 应用结合 Knife4j 进行 API 分组授权管理配置
java·spring boot·后端
亲爱的非洲野猪36 分钟前
ZooKeeper 深度实践:从原理到 Spring Boot 全栈落地
spring boot·zookeeper·java-zookeeper
Livingbody1 小时前
基于ERNIE-4.5-0.3B医疗领域大模型一站式分布式训练部署
后端
程序员爱钓鱼1 小时前
Go语言实战案例:使用sync.Mutex实现资源加锁
后端·go·trae
程序员爱钓鱼1 小时前
Go语言实战案例:使用context控制协程取消
后端·google·trae
Moment1 小时前
Node.js 这么多后端框架,我到底该用哪个?🫠🫠🫠
前端·后端·node.js