从spring到spring boot——JAVA项目开发
前言虽然AI已经大大方便了我们项目的开发有段时间我都不去看代码完全让AI给我改了-捂脸但我觉得还是要有些基础认识的后面也会努力的看看AI给我改的代码之前也有遇到给我乱改的情况还是要人为检查下好。MavenMaven是由Apache软件基金会天呐我已经看到这个基金会很多次了开发的跨平台项目管理工具专门用于Java项目的构建、依赖管理和项目信息管理。Maven的核心功能项目构建Build项目构建就是把源代码变成可运行的程序的过程包括清理clean→ 删除旧的编译文件编译compile→ 把.java文件变成.class文件测试test→ 运行单元测试打包package→ 生成jar/war文件部署deploy→ 发布到服务器mvn clean installJAR包JARJava ArchiveJava归档文件一个典型的JAR包my-library.jar ├── META-INF/ ← 元数据目录必须有 │ └── MANIFEST.MF ← 清单文件说明书 ├── com/ │ └── example/ │ ├── MyClass.class ← 编译后的Java类文件 │ ├── AnotherClass.class │ └── utils/ │ └── Helper.class ├── config.properties ← 配置文件 ├── images/ ← 资源文件 │ ├── logo.png │ └── icon.jpg └── templates/ ← 模板文件 └── email-template.htmlJAR包本质是ZIP压缩文件特殊之处在于包含元数据有META-INF/MANIFEST.MF文件可执行可以配置成直接运行的程序Java专用JVM可以直接识别和加载META-INF/MANIFEST.MF最重要Manifest-Version: 1.0 Created-By: Apache Maven Build-Jdk: 17.0.8 Implementation-Title: My Library Implementation-Version: 1.0.0 Main-Class: com.example.Main # 如果是可执行JAR这里指定入口 Class-Path: lib/dependency1.jar # 依赖的其他JAR包.class文件是Java源代码.java编译后的字节码文件JVMJava虚拟机能直接执行的文件编译过程Java源代码 (.java) ↓ 编译javac 字节码文件 (.class) ↓ 打包jar JAR包 (.jar) ↓ 运行java 程序执行核心作用1.代码复用在项目中使用MySQL数据库 1. 下载 mysql-connector-java-8.0.33.jar 2. 放到项目的lib目录 3. 代码Class.forName(com.mysql.cj.jdbc.Driver);2.打包文件3.可执行JAR包可直接运行WAR包WAR包Web Application ArchiveWeb应用程序JAR JSP HTML 配置文件myapp.war ├── WEB-INF/ │ ├── web.xml ← Web配置 │ ├── classes/ ← .class文件 │ └── lib/ ← 依赖的JAR包 ├── index.jsp └── static/ ├── css/ └── js/依赖管理Dependency Management统一管理项目需要使用的第三方库jar包比如数据库驱动MySQL、OracleWeb框架Spring、Hibernate工具类库Apache Commons、Guava传统手动管理jar包1. 去官网下载jar包 2. 复制到项目的lib目录 3. 发现这个jar包还依赖其他jar包 4. 继续下载依赖的jar包... 5. 版本冲突A需要commons-logging 1.1B需要1.2 6. 团队协作每个人都要重复这个过程Maven依赖管理!-- 在pom.xml中声明依赖 -- dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependency会自动从中央仓库下载这个jar包下载它依赖的所有jar包传递性依赖解决版本冲突统一管理到本地仓库项目管理Project Management标准化项目结构my-project/ ├── src/ │ ├── main/ │ │ ├── java/ # Java源代码 │ │ ├── resources/ # 配置文件 │ │ └── webapp/ # Web资源如果是Web项目 │ └── test/ │ ├── java/ # 测试代码 │ └── resources/ # 测试配置 ├── target/ # 编译输出目录 └── pom.xml # Maven配置文件通过pom.xml文件描述整个项目的信息项目名称、版本、描述开发者信息依赖的jar包构建配置插件配置Maven的核心概念项目对象模型POMProject Object Modelpom.xml是Maven的核心配置文件pom.xml示例?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion !-- 项目基本信息 -- groupIdcom.example/groupId !-- 组织ID -- artifactIdmy-app/artifactId !-- 项目ID -- version1.0-SNAPSHOT/version !-- 版本号 -- packagingjar/packaging !-- 打包方式 -- !-- 项目名称和描述 -- nameMy Application/name descriptionA simple Maven project/description !-- 依赖管理 -- dependencies !-- 这里声明需要的jar包 -- /dependencies /project坐标Coordinates- jar包的唯一标识Maven用三个元素定位一个jar包groupId组织ID通常是公司域名倒写如com.google,org.springframeworkartifactId项目ID模块名称如guava,spring-coreversion版本号如31.1-jre,5.3.23坐标示例com.google.guava:guava:31.1-jre └─────┬─────┘ └──┬──┘ └───┬───┘ groupId artifactId version仓库Repository- jar包的存储位置有三种仓库1.本地仓库Local Repository缓存下载的jar包避免重复下载。位置C:\Users\用户名\.m2\repositoryWindows2.中央仓库Central Repository官方的jar包仓库包含几乎所有开源jar包。位置https://repo.maven.apache.org/maven2/3.私服Private Repository加速下载、存储公司私有jar包。位置公司内部搭建的仓库如Nexus、Artifactory工作流程项目需要jar包 ↓ 检查本地仓库有直接使用 ↓ 没有 → 检查私服有下载到本地 ↓ 没有 → 从中央仓库下载 ↓ 保存到本地仓库供下次使用插件Maven也能通过插件扩展功能每个构建阶段都由插件完成常用插件示例build plugins !-- 编译插件 -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.11.0/version configuration source17/source !-- JDK版本 -- target17/target /configuration /plugin !-- 打包插件 -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-jar-plugin/artifactId version3.3.0/version /plugin /plugins /build多模块项目管理将大型项目拆分为多个子模块常用命令mvn clean # 清理target目录 mvn compile # 编译源代码 mvn test # 运行测试 mvn package # 打包生成jar/war mvn install # 安装到本地仓库 mvn deploy # 部署到远程仓库 mvn clean install # 清理并重新构建官方文档https://maven.apache.org/guides/SpringSpring Framework是一个开源的、轻量级的、分层的企业级Java应用开发框架提供从Web层到持久层的完整支持Java EEJava Platform, Enterprise Edition中文Java企业版专门用来做企业级网站、后台管理系统、电商平台、支付系统、APP 服务端的技术集合是一套标准 一堆技术组件三层架构把后端代码分成 3 个独立层次三层分别是表现层View / Controller也有叫Web层接收用户请求返回结果业务逻辑层Service处理核心业务规则数据访问层DAO / Repository也有叫持久层操作数据库JDBCJava Database Connectivity是Java提供的一套标准接口让Java程序能够连接和操作各种数据库两大核心基石IOC控制反转 - Inversion of Control传统方式程序主动创建对象new UserService()IOC方式对象的创建和管理交给Spring容器程序直接使用示例对比// 传统方式天呐就是我JAVA课学的老东西 public class OrderService { private UserService userService new UserService(); private OrderDao orderDao new OrderDao(); public void createOrder() { // 业务逻辑 } } // 使用IOC容器控制 Service public class OrderService { Autowired private UserService userService; Autowired private OrderDao orderDao; public void createOrder() { // 业务逻辑 } }IOC的好处解耦对象之间不直接依赖通过容器管理灵活可以轻松替换实现类可测试便于单元测试可以注入Mock对象统一管理对象的生命周期由容器管理AOP面向切面编程 - Aspect-Oriented Programming将横切关注点如日志、事务、权限从业务逻辑中分离出来通过切面统一处理这些关注点示例// 日志切面 Aspect Component public class LoggingAspect { // 前置通知方法执行前执行 Before(execution(* com.example.service.*.*(..))) public void logBefore(JoinPoint joinPoint) { System.out.println(方法 joinPoint.getSignature().getName() 即将执行); } // 后置通知方法执行后执行 After(execution(* com.example.service.*.*(..))) public void logAfter(JoinPoint joinPoint) { System.out.println(方法 joinPoint.getSignature().getName() 执行完毕); } // 环绕通知方法执行前后都执行 Around(execution(* com.example.service.*.*(..))) public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { long start System.currentTimeMillis(); Object result joinPoint.proceed(); // 执行目标方法 long end System.currentTimeMillis(); System.out.println(方法 joinPoint.getSignature().getName() 执行耗时: (end - start) ms); return result; } }AOP的好处代码复用日志、事务等逻辑只需写一次关注点分离业务逻辑更清晰易于维护修改横切逻辑只需修改切面非侵入式业务代码不需要修改Spring官方指南https://spring.io/guidesMyBatisMyBatis是一个优秀的持久层框架它支持定制化SQL、存储过程以及高级映射。MyBatis是一款半自动化的ORM对象关系映射框架它消除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。通过简单的XML或注解来配置和映射原生信息将接口和Java的POJOsPlain Old Java Objects映射成数据库中的记录。核心组件详解SqlSessionFactory创建SqlSession的工厂应用启动时创建。整个应用生命周期中只有一个实例SqlSession执行SQL命令、获取Mapper接口、管理事务。每次数据库操作都需要创建新的SqlSessionMapper接口定义数据库操作方法对应XML中的SQL语句。无需实现类MyBatis通过动态代理自动生成实现Executor负责SQL语句的执行核心配置文件mybatis-config.xml?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration !-- 1. 属性配置 -- properties resourcedb.properties property namedriver valuecom.mysql.cj.jdbc.Driver/ /properties !-- 2. 设置 -- settings !-- 开启驼峰命名自动映射 -- setting namemapUnderscoreToCamelCase valuetrue/ !-- 开启二级缓存 -- setting namecacheEnabled valuetrue/ !-- 日志实现 -- setting namelogImpl valueSLF4J/ !-- 延迟加载 -- setting namelazyLoadingEnabled valuetrue/ /settings !-- 3. 别名配置 -- typeAliases !-- 单个别名 -- typeAlias typecom.example.model.User aliasUser/ !-- 批量别名扫描包 -- package namecom.example.model/ /typeAliases !-- 4. 插件配置 -- plugins !-- 分页插件 -- plugin interceptorcom.github.pagehelper.PageInterceptor property namehelperDialect valuemysql/ /plugin /plugins !-- 5. 环境配置 -- environments defaultdevelopment environment iddevelopment !-- 事务管理器 -- transactionManager typeJDBC/ !-- 数据源 -- dataSource typePOOLED property namedriver value${driver}/ property nameurl value${url}/ property nameusername value${username}/ property namepassword value${password}/ /dataSource /environment /environments !-- 6. 映射器配置 -- mappers !-- 单个XML映射文件 -- mapper resourcecom/example/mapper/UserMapper.xml/ !-- 批量扫描包 -- package namecom.example.mapper/ /mappers /configurationAPIApplication Programming Interface应用程序编程接口负责在不同系统之间传递信息和执行操作。RESTful API遵循REST架构风格设计的API用URL来表示资源用HTTP方法GET、POST、PUT、DELETE来表示操作通过HTTP协议进行通信的APIHTTP状态码有没有人经常遇到404的情况原来这有个统称总共有5大类别类别范围含义1xx100-199信息请求已接收继续处理2xx200-299成功请求被成功接收、理解、接受3xx300-399重定向需要进一步操作4xx400-499客户端错误请求有语法错误或无法实现5xx500-599服务器错误服务器未能实现合法请求4xx状态码含义使用场景400 Bad Request错误的请求请求参数错误、格式错误401 Unauthorized未授权缺少或无效的认证信息403 Forbidden禁止访问有权限但被拒绝访问404 Not Found未找到资源不存在405 Method Not Allowed方法不允许使用了不支持的HTTP方法422 Unprocessable Entity无法处理的实体语义错误如字段验证失败429 Too Many Requests请求过多超过速率限制Spring BootSpring Boot基于Spring框架通过约定优于配置的理念旨在简化Spring应用的初始搭建和开发过程。特性SpringSpring Boot配置需要大量XML或Java配置自动配置极少配置依赖管理手动管理依赖版本起步依赖版本统一服务器需要外部服务器Tomcat内置服务器打包war包jar包可执行项目结构示例my-spring-boot-app/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/ │ │ │ ├── MyApplication.java # 启动类 │ │ │ ├── controller/ # 控制器 │ │ │ ├── service/ # 服务层 │ │ │ ├── repository/ # 数据访问层 │ │ │ └── config/ # 配置类 │ │ └── resources/ │ │ ├── application.properties # 配置文件 │ │ ├── application-dev.yml # 开发环境配置 │ │ ├── application-prod.yml # 生产环境配置 │ │ └── static/ # 静态资源 │ └── test/ │ └── java/ │ └── com/example/ │ └── MyApplicationTests.java ├── pom.xml # Maven配置 └── README.md技术栈关系总结技术角色与Spring Boot的关系Maven构建工具管理Spring Boot项目的依赖和构建Spring Boot快速开发框架基于Spring的增强框架Spring Framework核心框架Spring Boot的基础MyBatis持久层框架可选组件可与Spring Boot集成