1. 初识Spring Boot:为什么选择它?
记得第一次接触Spring Boot是在2015年,当时还在用传统的SSH框架做企业级开发。每次新建项目都要花半天时间配置各种XML文件,光是整合Spring和Hibernate就得写上百行配置。直到有一天团队里的架构师神秘兮兮地说:"试试这个吧",从此打开了新世界的大门。
Spring Boot本质上是对Spring框架的"懒人包"封装。它通过约定优于配置(Convention Over Configuration)的理念,把那些我们不得不写的样板代码全部自动化了。比如:
- 自动配置数据源(再也不用写DataSource bean了)
- 内嵌Tomcat/Jetty服务器(告别手动部署war包)
- starter依赖管理(一个pom搞定所有关联jar包)
新手常见误区:以为Spring Boot是全新的框架,其实它只是Spring的"快捷方式"。所有Spring能做的它都能做,只是更省事。
2. 环境准备:5分钟快速上手
2.1 开发工具选型
我强烈推荐以下组合:
- IDEA Ultimate版:社区版也能用,但Ultimate的Spring Boot支持更完善
- JDK 8或11:LTS版本最稳定(注意避开Java 9/10/12这些过渡版本)
- Maven 3.6+:Gradle也可以,但国内Maven仓库更稳定
2.2 创建第一个项目
有三种主流方式:
-
官网生成器(start.spring.io):
- 选最新稳定版(目前是3.1.x)
- 依赖勾选Spring Web(做Web项目必备)
- 打包方式用jar(war适合传统部署)
-
IDEA直接创建:
- New Project → Spring Initializr
- 勾选"Create from archetype"更规范
-
命令行创建(适合老手):
bash复制
curl https://start.spring.io/starter.zip -d dependencies=web -o demo.zip
3. 项目结构深度解析
创建完项目后,你会看到这样的目录结构:
code复制src/
├── main/
│ ├── java/
│ │ └── com/example/demo/
│ │ ├── DemoApplication.java # 启动类
│ │ └── controller/ # 建议新建
│ └── resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ └── application.properties # 配置文件
几个关键点:
- 启动类必须放在根包:因为@ComponentScan默认扫描同级及子包
- 配置文件优先级:
- application.properties > application.yml
- 后者更易读但容易缩进错误
- 静态资源存放规则:
- /static下的index.html会自动成为首页
- 访问路径不用带static前缀
4. 编写第一个REST接口
4.1 基础Controller写法
在controller包下新建HelloController.java:
java复制@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Spring Boot!";
}
}
启动应用后访问 http://localhost:8080/hello 就能看到结果。这里有几个技术细节:
@RestController=@Controller+@ResponseBody- 默认端口8080,在application.properties修改:
properties复制server.port=9090
4.2 参数传递的三种方式
实际开发中更常见的场景:
java复制// 1. PathVariable
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// 2. RequestParam
@GetMapping("/search")
public List<User> search(@RequestParam String keyword) {
return userService.search(keyword);
}
// 3. RequestBody
@PostMapping("/save")
public Result saveUser(@RequestBody User user) {
return userService.save(user);
}
5. 自动配置原理揭秘
Spring Boot最神奇的地方在于:为什么我们什么都没配置就能直接运行?关键在于:
5.1 条件装配机制
查看spring-boot-autoconfigure包下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,你会发现所有自动配置类。以DataSourceAutoConfiguration为例:
java复制@AutoConfiguration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
//...
}
关键注解:
@ConditionalOnClass:类路径存在指定类时才生效@ConditionalOnMissingBean:容器中没有该Bean时才生效
5.2 自定义配置覆盖
如果想覆盖默认配置,只需要:
- 在application.properties中修改:
properties复制spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456 - 或者显式声明自己的Bean:
java复制@Bean @ConfigurationProperties(prefix = "app.datasource") public DataSource myDataSource() { return DataSourceBuilder.create().build(); }
6. 开发中的实用技巧
6.1 热部署方案
每次改代码都要重启?试试这些方案:
-
DevTools(推荐):
xml复制<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>- 修改代码后按Ctrl+F9(IDEA快捷键)
- 注意:默认不触发静态资源更新
-
JRebel插件(收费但强大):
- 支持方法体修改即时生效
- 适合大型项目
6.2 日志配置技巧
Spring Boot默认用Logback,建议这样配置:
properties复制# 控制台输出彩色日志(仅支持IDEA)
spring.output.ansi.enabled=always
# 指定日志级别
logging.level.root=INFO
logging.level.com.example.demo=DEBUG
# 输出到文件
logging.file.name=app.log
logging.file.max-size=10MB
7. 常见问题排查指南
7.1 启动报错排查流程
-
端口冲突:
text复制
Web server failed to start. Port 8080 was already in use.解决方案:
bash复制netstat -ano | findstr 8080 # Windows lsof -i :8080 # Mac/Linux -
循环依赖:
text复制
The dependencies of some of the beans in the application context form a cycle解决方案:
- 使用@Lazy延迟加载
- 重构代码结构
7.2 性能优化建议
- JVM参数调整:
bash复制
java -Xms512m -Xmx1024m -jar your-app.jar - 组件扫描优化:
java复制@SpringBootApplication(scanBasePackages = "com.your.package") - 关闭不需要的自动配置:
java复制@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
8. 项目实战:用户管理系统
让我们用第一天学到的知识,实现一个简易版用户管理:
-
创建User实体类:
java复制@Data public class User { private Long id; private String name; private Integer age; } -
编写Service层:
java复制@Service public class UserService { private final Map<Long, User> userMap = new ConcurrentHashMap<>(); public User save(User user) { user.setId(System.currentTimeMillis()); userMap.put(user.getId(), user); return user; } } -
完善Controller:
java复制@RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @PostMapping public User create(@RequestBody User user) { return userService.save(user); } @GetMapping("/{id}") public User get(@PathVariable Long id) { return userService.findById(id); } }
测试工具推荐:
- Postman:手工测试API
- curl命令快速验证:
bash复制curl -X POST -H "Content-Type: application/json" -d '{"name":"张三","age":20}' http://localhost:8080/api/users
9. 第二天学习路线建议
如果你已经掌握以上内容,接下来可以探索:
- 数据库集成:
- Spring Data JPA
- MyBatis
- 安全控制:
- Spring Security基础
- JWT认证
- API文档:
- Swagger UI集成
- OpenAPI 3.0规范
个人经验:不要急于学习高级功能,先把自动配置原理、依赖注入机制这些基础吃透。我见过太多人因为基础不牢,后面遇到复杂问题就束手无策。