文章目录
- [传统 Spring XML 配置 vs Spring Boot Starter 对比文档](#传统 Spring XML 配置 vs Spring Boot Starter 对比文档)
-
- 项目背景
- 一、数据源配置对比
-
- [1.1 传统 XML 方式](#1.1 传统 XML 方式)
- [1.2 Spring Boot 方式](#1.2 Spring Boot 方式)
- [二、MyBatis 集成对比](#二、MyBatis 集成对比)
-
- [2.1 传统 XML 方式](#2.1 传统 XML 方式)
- [2.2 Spring Boot 方式](#2.2 Spring Boot 方式)
- [三、Bean 扫描与依赖注入对比](#三、Bean 扫描与依赖注入对比)
-
- [3.1 传统 XML 方式](#3.1 传统 XML 方式)
- [3.2 Spring Boot 方式](#3.2 Spring Boot 方式)
- 四、应用入口对比
-
- [4.1 传统 XML 方式](#4.1 传统 XML 方式)
- [4.2 Spring Boot 方式](#4.2 Spring Boot 方式)
- 五、配置文件对比
-
- [5.1 传统 XML 方式(5+ 个文件)](#5.1 传统 XML 方式(5+ 个文件))
- [5.2 Spring Boot 方式(1-2 个文件)](#5.2 Spring Boot 方式(1-2 个文件))
- [六、pom.xml 依赖对比](#六、pom.xml 依赖对比)
-
- [6.1 传统 XML 方式](#6.1 传统 XML 方式)
- [6.2 Spring Boot 方式](#6.2 Spring Boot 方式)
- 七、部署对比
-
- [7.1 传统 XML 方式](#7.1 传统 XML 方式)
- [7.2 Spring Boot 方式](#7.2 Spring Boot 方式)
- 八、总结
-
- [Spring Boot 的核心优势](#Spring Boot 的核心优势)
- [传统 Spring 的适用场景](#传统 Spring 的适用场景)
开源仓库: https://gitee.com/he-weigang/spring.git
传统 Spring XML 配置 vs Spring Boot Starter 对比文档
项目背景
- 传统 Spring XML 项目 :
I:/Spring(当前项目) - 功能:用户注册、登录
- 技术栈:Spring 5.3 + MyBatis 3.5 + Druid 数据源 + MySQL
一、数据源配置对比
1.1 传统 XML 方式
beans.xml:
xml
<!-- 需要手动配置数据源 Bean -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="5"/>
<property name="minIdle" value="5"/>
<property name="maxActive" value="20"/>
</bean>
db.properties:
properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/user_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456
beans.xml 引入外部配置:
xml
<context:property-placeholder location="classpath:db.properties"/>
1.2 Spring Boot 方式
application.yml:
yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/user_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
druid:
initial-size: 5
min-idle: 5
max-active: 20
对比说明:
- 传统方式需要 2 个文件(beans.xml + db.properties)+ 手动定义 Bean
- Spring Boot 只需 1 个配置文件,starter 自动识别并创建数据源 Bean
二、MyBatis 集成对比
2.1 传统 XML 方式
beans.xml 配置 SqlSessionFactory:
xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
beans.xml 配置每个 DAO Bean:
xml
<bean id="userDao" class="com.example.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
mybatis-config.xml:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="com.example.entity"/>
</typeAliases>
</configuration>
UserDaoMapper.xml:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.dao.UserDao">
<insert id="insertUser" parameterType="User">
INSERT INTO t_user (name, password, nickname, age, gender, head_url, creator)
VALUES (#{name}, #{password}, #{nickname}, #{age}, #{gender}, #{headUrl}, #{creator})
</insert>
<select id="findByNameAndPassword" resultType="User">
SELECT id, name, password, nickname, age, gender,
head_url AS headUrl, create_time AS createTime, creator,
modify_time AS modifyTime, modifier
FROM t_user
WHERE name = #{name} AND password = #{password}
</select>
</mapper>
2.2 Spring Boot 方式
application.yml:
yaml
spring:
datasource:
# 数据源配置同上...
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.entity
configuration:
map-underscore-to-camel-case: true
UserDao.java(注解方式):
java
@Mapper
public interface UserDao {
@Insert("INSERT INTO t_user (name, password, nickname, age, gender, head_url, creator) " +
"VALUES (#{name}, #{password}, #{nickname}, #{age}, #{gender}, #{headUrl}, #{creator})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
@Select("SELECT * FROM t_user WHERE name = #{name} AND password = #{password}")
User findByNameAndPassword(@Param("name") String name, @Param("password") String password);
@Select("SELECT * FROM t_user WHERE name = #{name}")
User findByName(String name);
}
对比说明:
| 配置项 | 传统 XML | Spring Boot |
|---|---|---|
| SqlSessionFactory | 手动配置 SqlSessionFactoryBean | 自动配置 |
| DAO Bean | 每个 DAO 手动配置 <bean> |
@Mapper 注解自动扫描 |
| MyBatis 全局配置 | 单独的 mybatis-config.xml | 可省略,或在 yml 中配置 |
| SQL 映射 | XML mapper 文件 | 可用注解,也可继续用 XML |
三、Bean 扫描与依赖注入对比
3.1 传统 XML 方式
beans.xml:
xml
<!-- 每个 Bean 都要手动声明 -->
<bean id="userDao" class="com.example.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<bean id="userService" class="com.example.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userController" class="com.example.controller.UserController">
<property name="userService" ref="userService"/>
</bean>
UserDaoImpl.java:
java
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
// 必须提供 setter 方法供 Spring 注入
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public int insertUser(User user) {
try (SqlSession session = sqlSessionFactory.openSession()) {
return session.insert("com.example.dao.UserDao.insertUser", user);
}
}
}
UserServiceImpl.java:
java
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 必须提供 setter 方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public User register(...) {
User existUser = userDao.findByName(name);
// ...
}
}
3.2 Spring Boot 方式
UserDao.java:
java
@Mapper // MyBatis 自动生成代理对象,无需实现类
public interface UserDao {
// 方法签名 + 注解即可
}
UserServiceImpl.java:
java
@Service
public class UserServiceImpl implements UserService {
@Autowired // 自动注入,不需要 setter
private UserDao userDao;
@Override
public User register(...) {
User existUser = userDao.findByName(name);
// ...
}
}
UserController.java:
java
@RestController
public class UserController {
@Autowired
private UserService userService;
}
对比说明:
| 项目 | 传统 XML | Spring Boot |
|---|---|---|
| Bean 声明 | XML 中 <bean> 手动声明 |
注解 @Service/@Controller 自动扫描 |
| 依赖注入 | XML 中 <property> 或 setter |
@Autowired 自动注入 |
| 需不需要实现类 | 是(UserDaoImpl) | 否(MyBatis 动态代理) |
| setter 方法 | 必须(供 Spring 注入) | 不需要 |
四、应用入口对比
4.1 传统 XML 方式
App.java:
java
package com.example.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
// 1. 手动加载 Spring IOC 容器(指定 XML 配置文件)
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 2. 手动获取 Bean(需要强制类型转换)
UserController userController = (UserController) context.getBean("userController");
// 3. 手动调用
userController.register("test001", "pwd123", "测试用户", 25, "男");
}
}
4.2 Spring Boot 方式
AppBoot.java:
java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 包含了 @Configuration、@EnableAutoConfiguration、@ComponentScan
public class AppBoot {
public static void main(String[] args) {
// 一行代码启动,自动扫描、自动配置
SpringApplication.run(AppBoot.class, args);
}
}
UserController.java:
java
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public String register(@RequestBody User user) {
userService.register(user.getName(), user.getPassword(),
user.getNickname(), user.getAge(), user.getGender());
return "注册成功";
}
@PostMapping("/login")
public String login(@RequestBody User user) {
User u = userService.login(user.getName(), user.getPassword());
return "登录成功: " + u.getNickname();
}
}
对比说明:
| 项目 | 传统 XML | Spring Boot |
|---|---|---|
| 启动方式 | ClassPathXmlApplicationContext("beans.xml") |
SpringApplication.run(AppBoot.class) |
| 配置加载 | 手动指定 XML 文件 | 自动扫描 |
| Web 层 | 需要手动配置 DispacherServlet | 自动配置 |
| HTTP 映射 | 手动在 XML 或代码中配置 | 注解 @RequestMapping |
| 类型转换 | getBean("id") 返回 Object,需强转 |
getBean(Class) 直接返回目标类型 |
五、配置文件对比
5.1 传统 XML 方式(5+ 个文件)
src/main/resources/
├── db.properties # 数据库连接信息
├── beans.xml # Spring IOC 配置(Bean 定义、依赖注入)
├── mybatis-config.xml # MyBatis 全局配置(设置、别名)
├── mapper/
│ └── UserDaoMapper.xml # SQL 映射文件
└── log4j.properties # 日志配置
5.2 Spring Boot 方式(1-2 个文件)
src/main/resources/
├── application.yml # 一切配置(数据源、MyBatis、日志、服务器端口等)
└── mapper/
└── UserDaoMapper.xml # SQL 映射(如果用 XML 方式)
application.yml 示例:
yaml
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/user_system
username: root
password: 123456
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.entity
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.example: DEBUG
六、pom.xml 依赖对比
6.1 传统 XML 方式
xml
<dependencies>
<!-- Spring 核心(需要明确指定每个模块) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.30</version>
</dependency>
<!-- MyBatis(需要单独引入) -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.2</version>
</dependency>
<!-- 数据源(需要手动选择并配置) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.20</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- 日志(需要手动选择) -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
6.2 Spring Boot 方式
xml
<dependencies>
<!-- 一个 starter 代替上面所有 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.18</version>
</dependency>
<!-- MyBatis starter(自动管理版本) -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.2</version>
</dependency>
<!-- MySQL 驱动(starter 自动管理) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 测试(starter 自动包含) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.7.18</version>
<scope>test</scope>
</dependency>
</dependencies>
对比说明:
| 项目 | 传统 XML | Spring Boot |
|---|---|---|
| 依赖数量 | 10+ 个 | 4 个 |
| 版本管理 | 手动指定,容易冲突 | starter 统一管理 |
| 可维护性 | 繁琐,容易遗漏 | 简洁 |
七、部署对比
7.1 传统 XML 方式
- 打包成 WAR 文件
- 需要部署到外部 Tomcat/Jetty 等容器
- 步骤:
mvn clean package -DskipTests- 将 WAR 包复制到 Tomcat 的
webapps目录 - 启动 Tomcat
7.2 Spring Boot 方式
- 打包成 JAR 文件(包含嵌入式服务器)
- 直接
java -jar运行 - 步骤:
mvn clean package -DskipTestsjava -jar target/spring-mybatis-xml-1.0.0.jar
八、总结
| 对比项 | 传统 Spring XML | Spring Boot Starter |
|---|---|---|
| 配置方式 | XML 手动配置 | 注解 + 自动配置 |
| Bean 管理 | XML <bean> 声明 |
@Service/@Controller 扫描 |
| 依赖注入 | XML <property> 或 setter |
@Autowired |
| 数据源 | 手动配置 DruidDataSource Bean | spring.datasource.* |
| MyBatis | 手动配置 SqlSessionFactory + DAO Bean | spring.mybatis.* + @Mapper |
| 配置文件 | 5+ 个分散文件 | 1-2 个集中配置 |
| 依赖管理 | 手动指定版本 | starter 统一管理 |
| 部署 | WAR + 外部容器 | JAR + 内嵌服务器 |
| 启动 | 手动加载 XML | 一行代码 SpringApplication.run() |
| 学习曲线 | 陡峭(需要了解 XML 配置) | 平缓(约定大于配置) |
Spring Boot 的核心优势
- 自动配置:starter 自动完成大量配置工作
- 约定大于配置:遵守约定即可,减少配置
- 内嵌服务器:部署简单,无需管理外部容器
- 生态整合:微服务、消息队列、配置中心等一键集成
- 开发效率:热部署、Actuator 监控等提升开发体验
传统 Spring 的适用场景
- 遗留系统迁移
- 需要精细控制配置的场景
- 学习 Spring 底层原理