初识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 小时前
Semaphore 与 RateLimiter:并发控制双雄详解
后端
掘金者阿豪1 小时前
异构数据同步最怕什么?不是同步慢,而是数据对不上
后端
古法安卓2 小时前
Android-日志系统源码解析
android·java·android studio
程序员cxuan2 小时前
Claude 官方的学习教程,太强了。
人工智能·后端·程序员
老孙讲技术2 小时前
把工地遮挡和掉线接进项目部:setMessageCallback 订 alarm 与 deviceStatus
后端·物联网·音视频开发
老孙讲技术2 小时前
关店后有人进门,监控值班群却没响:用 setMessageCallback 订 human,再用 aiHuman 打开人形
后端·物联网·音视频开发
LEE2 小时前
原来 Claude Code 最厉害的工具,一行代码都不写
前端·后端
老孙讲技术2 小时前
把园区几百路摄像头收进值班台账:bindDevice 入账与 listDeviceDetailsByPage 翻页
后端·物联网·音视频开发
用户7813667114452 小时前
emplace_back vs push_back 详解
后端
老孙讲技术3 小时前
把没网没电的户外点位接进出画值班台:unBindDeviceInfo 核 SIMCard 与 bindDeviceLive
后端·物联网·音视频开发