# 第01天:项目初始化和Maven配置 ## 📚 今日目标 1. 理解什么是Spring Boot 2. 理解什么是Spring Boot Starter 3. 创建Maven项目结构 4. 配置pom.xml文件 5. 理解项目依赖关系 --- ## 🎯 知识点0:什么是Spring Boot?(先理解这个) ### 生活中的例子 **传统Java开发 vs Spring Boot开发** **传统方式(复杂)**: ``` 想象你要做一道菜: 1. 买锅(配置Tomcat服务器) 2. 买调料(配置各种XML文件) 3. 准备食材(写很多配置代码) 4. 生火(启动服务器) 5. 炒菜(写业务代码) ``` **Spring Boot方式(简单)**: ``` Spring Boot就像"外卖套餐": 1. 打开包装(引入依赖) 2. 加热(运行main方法) 3. 开吃(直接写业务代码) ``` ### 最简单的例子 **传统Spring项目**(需要配置很多XML): ```java // 1. 需要web.xml配置 // 2. 需要applicationContext.xml配置 // 3. 需要配置数据源、事务等 // 4. 需要部署到Tomcat服务器 // ... 很多配置 ``` **Spring Boot项目**(几乎零配置): ```java // 1. 创建一个类 @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } // 2. 运行main方法 // 3. 完成!服务器自动启动,可以访问了 ``` ### Spring Boot的核心特点 **1. 自动配置(Auto Configuration)** ``` 传统方式:需要手动配置每个组件 Spring Boot:检测到classpath中的类,自动配置 ``` **例子**: ```java // 传统方式:需要手动配置数据源 @Configuration public class DataSourceConfig { @Bean public DataSource dataSource() { // 写很多配置代码 } } // Spring Boot:引入依赖,自动配置 // 只需要在application.yml中写: spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 // 数据源自动创建好了! ``` **2. 起步依赖(Starter Dependencies)** ``` 传统方式:需要一个个引入依赖,还要处理版本冲突 Spring Boot:引入一个starter,自动引入所有相关依赖 ``` **例子**: ```xml org.springframework spring-web org.springframework spring-webmvc org.springframework.boot spring-boot-starter-web ``` **3. 内嵌服务器(Embedded Server)** ``` 传统方式:需要安装Tomcat,打包成war,部署到服务器 Spring Boot:内嵌Tomcat,打包成jar,直接运行 ``` **例子**: ```bash # 传统方式 1. 打包成war文件 2. 部署到Tomcat 3. 启动Tomcat 4. 访问应用 # Spring Boot方式 1. 打包成jar文件 2. java -jar app.jar 3. 完成!直接访问 ``` ### 最简单的完整例子 **创建一个Web接口**: ```java // 1. 主类 @SpringBootApplication public class HelloApp { public static void main(String[] args) { SpringApplication.run(HelloApp.class, args); } } // 2. 控制器(处理HTTP请求) @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello Spring Boot!"; } } // 3. 运行main方法 // 4. 浏览器访问:http://localhost:8080/hello // 5. 看到:Hello Spring Boot! ``` **就这么简单!** - 不需要配置web.xml - 不需要配置Tomcat - 不需要部署 - 直接运行,直接访问 ### 为什么用Spring Boot? **传统Spring的问题**: - ❌ 配置复杂(XML、Java配置) - ❌ 依赖管理困难(版本冲突) - ❌ 部署复杂(需要服务器) - ❌ 开发效率低 **Spring Boot的优势**: - ✅ 零配置(约定优于配置) - ✅ 自动配置(开箱即用) - ✅ 内嵌服务器(直接运行) - ✅ 开发效率高 ### 总结 **Spring Boot = Spring框架 + 自动配置 + 起步依赖 + 内嵌服务器** **核心思想**:**约定优于配置** - 不需要配置的,就不配置 - 有默认值的,就用默认值 - 需要配置的,才配置 --- ## 🎯 知识点1:什么是Spring Boot Starter? ### 为什么需要Starter? **问题场景**: - 每次使用某个框架(如MyBatis),都要手动配置很多Bean - 配置复杂,容易出错 - 不同项目重复配置 **解决方案**:Spring Boot Starter - 把常用配置打包成一个依赖 - 引入依赖后自动配置 - 开箱即用,零配置 **例子**: ```xml org.mybatis.spring.boot mybatis-spring-boot-starter ``` ### 我们的目标 创建一个 `db-router-spring-boot-starter`,让用户: 1. 引入依赖 2. 配置几个参数 3. 使用 `@DBRouter` 注解 4. 自动实现分库分表 --- ## 🎯 知识点2:Maven项目结构 ### 标准Maven项目结构 ``` db-router-spring-boot-starter/ ├── pom.xml # Maven配置文件 ├── src/ │ ├── main/ │ │ ├── java/ # Java源代码 │ │ │ └── cn/bugstack/middleware/db/router/ │ │ │ ├── annotation/ # 注解 │ │ │ ├── config/ # 配置类 │ │ │ ├── dynamic/ # 动态数据源 │ │ │ ├── strategy/ # 路由策略 │ │ │ └── util/ # 工具类 │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring.factories # 自动配置入口 │ └── test/ # 测试代码 │ └── java/ ``` ### 为什么这样组织? - **annotation**:存放自定义注解(@DBRouter等) - **config**:Spring配置类(自动配置) - **dynamic**:动态数据源相关类 - **strategy**:路由策略(策略模式) - **util**:工具类(字符串、属性等) --- ## 🛠️ 实践任务1:创建项目结构 ### 步骤1:创建目录 在你的项目根目录执行: ```bash mkdir -p src/main/java/cn/bugstack/middleware/db/router/{annotation,config,dynamic,strategy/impl,util} mkdir -p src/main/resources/META-INF mkdir -p src/test/java ``` ### 步骤2:验证结构 ```bash tree src/ # 如果没有tree命令,用 find src -type d ``` 应该看到: ``` src/ ├── main │ ├── java │ │ └── cn │ │ └── bugstack │ │ └── middleware │ │ └── db │ │ └── router │ │ ├── annotation │ │ ├── config │ │ ├── dynamic │ │ ├── strategy │ │ │ └── impl │ │ └── util │ └── resources │ └── META-INF └── test └── java ``` --- ## 🛠️ 实践任务2:创建pom.xml ### 完整pom.xml代码 在项目根目录创建 `pom.xml`: ```xml 4.0.0 cn.bugstack.middleware db-router-spring-boot-starter 1.0.2 jar org.springframework.boot spring-boot-starter-parent 2.3.5.RELEASE UTF-8 1.8 1.8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-autoconfigure org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-starter-aop org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.4 commons-beanutils commons-beanutils 1.9.4 commons-lang commons-lang 2.6 org.springframework.boot spring-boot-starter-test test db-router-spring-boot-starter org.apache.maven.plugins maven-compiler-plugin 3.8.1 1.8 1.8 UTF-8 org.apache.maven.plugins maven-source-plugin 3.2.1 attach-sources jar ``` ### 依赖说明 **📋 依赖分类总结**: **✅ 必须依赖(核心功能需要)**: 1. spring-boot-starter - Spring Boot核心 2. spring-boot-autoconfigure - 自动配置 3. spring-boot-starter-aop - AOP切面 4. mybatis-spring-boot-starter - MyBatis插件 5. commons-beanutils - 反射获取属性 6. commons-lang - 字符串工具 **❌ 可选依赖(已注释,可删除)**: 1. mysql-connector-java - 用户项目会自己引入 2. fastjson - 代码中没有使用 3. junit - spring-boot-starter-test已包含 **⚠️ 可选但建议保留**: 1. spring-boot-configuration-processor - IDE提示(optional=true,不影响运行时) 2. spring-boot-starter-test - 测试用(scope=test,不影响打包) **📝 关于HikariCP的说明**: - 第15天的DataSourceAutoConfig代码中使用了HikariCP创建数据源 - 但pom.xml中没有HikariCP依赖,因为: 1. 用户项目通常会引入spring-boot-starter-jdbc(已包含HikariCP) 2. 或者用户自己选择连接池(Druid、HikariCP等) 3. 我们的starter不应该强制指定连接池 - 如果测试时需要,可以临时添加: ```xml com.zaxxer HikariCP ``` --- #### 1. Spring Boot Starter ```xml org.springframework.boot spring-boot-starter ``` **作用**:Spring Boot核心功能,包含自动配置、日志等 #### 2. Spring Boot Autoconfigure ```xml org.springframework.boot spring-boot-autoconfigure ``` **作用**:自动配置的核心,我们用它来实现自动配置 #### 3. Spring Boot AOP ```xml org.springframework.boot spring-boot-starter-aop ``` **作用**:AOP功能,用于拦截方法,实现路由逻辑 #### 4. MyBatis Spring Boot Starter ```xml org.mybatis.spring.boot mybatis-spring-boot-starter ``` **作用**:MyBatis集成,我们需要拦截SQL修改表名 #### 5. Commons BeanUtils ```xml commons-beanutils commons-beanutils ``` **作用**:通过反射获取对象属性值(如获取userId) **是否必须**:✅ 必须 - PropertyUtil.getProperty()方法使用 #### 6. Commons Lang ```xml commons-lang commons-lang ``` **作用**:字符串工具类(isBlank等方法) **是否必须**:✅ 必须 - StringUtils使用 #### 7. MySQL驱动 **是否必须**:❌ 可选 - 用户项目会自己引入数据库驱动 #### 8. FastJSON **是否必须**:❌ 可选 - 代码中没有使用,可以删除 #### 9. 测试依赖 **是否必须**:❌ 可选 - 只在测试时需要(scope=test) --- ## 🎓 知识点拓展 ### 拓展1:Maven依赖作用域(Scope) ```xml compile provided runtime test system ``` **为什么spring-boot-configuration-processor用optional?** - `optional=true` 表示这个依赖不会传递 - 只在开发时用于IDE提示,运行时不需要 - 避免用户项目引入不必要的依赖 ### 拓展2:Spring Boot版本选择 **为什么用2.3.5?** - 这是原项目使用的版本 - 2.x版本稳定,兼容性好 - 3.x版本需要Java 17+,门槛更高 **如何选择版本?** - 生产环境:选择稳定版本(如2.7.x) - 学习环境:可以尝试最新版本 - 注意:不同版本API可能有差异 ### 拓展3:Maven坐标(Coordinates) ```xml cn.bugstack.middleware db-router-spring-boot-starter 1.0.2 ``` **命名规范**: - groupId:通常是域名倒写(如com.company.project) - artifactId:项目名,小写,用连字符 - version:语义化版本(主版本.次版本.修订版本) --- ## ✅ 今日检查清单 - [ ] 创建了完整的项目目录结构 - [ ] 创建了pom.xml文件 - [ ] 理解了每个依赖的作用 - [ ] 能够解释为什么需要这些依赖 - [ ] 完成了拓展阅读 --- ## 🎯 明日预告 明天我们将学习: - 什么是数据库路由 - 为什么需要分库分表 - 路由的基本原理 --- ## 💡 思考题 1. 如果不用Spring Boot Starter,用户需要手动配置哪些东西? 2. 为什么starter的依赖要用`optional=true`? 3. Maven的``标签有什么作用? --- ## 📚 参考资源 - [Spring Boot官方文档](https://spring.io/projects/spring-boot) - [Maven官方文档](https://maven.apache.org/guides/) - [Spring Boot Starter开发指南](https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters)