传统 Spring XML 配置 vs Spring Boot Starter 对比文档

文章目录

  • [传统 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 等容器
  • 步骤:
    1. mvn clean package -DskipTests
    2. 将 WAR 包复制到 Tomcat 的 webapps 目录
    3. 启动 Tomcat

7.2 Spring Boot 方式

  • 打包成 JAR 文件(包含嵌入式服务器)
  • 直接 java -jar 运行
  • 步骤:
    1. mvn clean package -DskipTests
    2. java -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 的核心优势

  1. 自动配置:starter 自动完成大量配置工作
  2. 约定大于配置:遵守约定即可,减少配置
  3. 内嵌服务器:部署简单,无需管理外部容器
  4. 生态整合:微服务、消息队列、配置中心等一键集成
  5. 开发效率:热部署、Actuator 监控等提升开发体验

传统 Spring 的适用场景

  1. 遗留系统迁移
  2. 需要精细控制配置的场景
  3. 学习 Spring 底层原理
相关推荐
代码漫谈2 小时前
JVM 参数调优:Spring Boot与JDK新特性的最佳结合
java·jvm·spring boot
北风朝向2 小时前
springboot使用@Validated校验List接口参数
spring boot·后端·list·校验·valid
海兰2 小时前
【第39篇】spring-ai-alibaba-graph-example学习路径概览
人工智能·spring boot·学习·spring·spring ai
Don.TIk2 小时前
天机の学堂
java·spring boot·spring·maven·mybatis
Devin~Y2 小时前
大厂Java面试实录:Spring Boot/JPA/Redis/Kafka/K8s 可观测性 + Spring AI RAG/Agent(小Y翻车现场)
java·spring boot·redis·mybatis·hibernate·spring mvc·jpa
SuperherRo3 小时前
服务攻防-开发框架安全&ThinkPHP&Laravel&SpringBoot&Struts2&SpringCloud&复现
spring boot·laravel·thinkphp·struts2·框架安全
_waylau3 小时前
“Java+AI全栈工程师”问答01:Spring MVC登录页面错误提示
java·开发语言·vue.js·后端·spring·mvc·springcloud
happymaker06263 小时前
Spring学习日记——Day01(简单配置使用Spring,手写Spring的简单工厂模式)
java·学习·spring
Cyan_RA94 小时前
SpringMVC 视图和视图解析器 万字详解
java·spring·mvc·springmvc·请求重定向·modelandview·视图解析器