一、配置文件基础结构
每个 Spring 项目的核心配置文件 spring.xml 需包含以下基础声明:
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置内容 -->
</beans>
关键点:
- 声明 XML 版本和编码。
- 引入
beans和context命名空间,用于定义 Bean 和注解驱动配置。
二、组件扫描与过滤
作用 :自动扫描并注册带有 @Component、@Service 等注解的类为 Spring Bean。
你的配置:
xml
<context:component-scan base-package="cn.cjxy">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
解释:
base-package="cn.cjxy":扫描该包及其子包下的所有组件。<exclude-filter>:排除@Controller注解的类(由 Spring MVC 管理)。
最佳实践:
- 分层扫描 :若项目分层明确(如
cn.cjxy.service、cn.cjxy.dao),可细化扫描路径。 - 过滤策略 :通过
include-filter或exclude-filter精准控制扫描范围。
三、加载外部属性文件
作用 :从 jdbc.properties 加载数据库连接信息,避免硬编码。
你的配置:
xml
<context:property-placeholder location="classpath:jdbc.properties"/>
关键点:
location="classpath:jdbc.properties":从类路径(如src/main/resources)加载文件。- 属性文件示例
jdbc.properties:
properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
username=root
password=your_password
注意事项:
- 确保属性键名与 XML 中
${key}完全匹配(如username而非name)。
四、配置数据源(Druid)
作用:定义数据库连接池,管理连接资源。
你的配置:
xml
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="url" value="${url}"/>
<property name="driverClassName" value="${driver}"/>
</bean>
优化建议:
- 连接池参数:添加初始连接数、最大活跃数等配置。
xml
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
<property name="minIdle" value="5"/>
五、整合 MyBatis
作用 :配置 MyBatis 的 SqlSessionFactory 和 Mapper 接口扫描。
1. 配置 SqlSessionFactory
你的配置:
xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<property name="typeAliasesPackage" value="cn.cjxy.domain"/>
</bean>
解释:
dataSource:引用上一步定义的 Druid 数据源。typeAliasesPackage:自动为cn.cjxy.domain包下的类注册别名(如User对应User)。
扩展配置:
- 指定 MyBatis 配置文件:
xml
<property name="configLocation" value="classpath:mybatis-config.xml"/>
- 加载 XML 映射文件:
xml
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
2. 扫描 Mapper 接口
你的配置:
xml
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.cjxy.mapper"/>
</bean>
作用 :自动为 cn.cjxy.mapper 包下的接口生成代理实现类,无需手动编写实现。
注意事项:
- 确保 Mapper 接口与 XML 映射文件的路径一致(如
UserMapper.java对应UserMapper.xml)。
六、事务管理(补充)
作用:添加声明式事务支持(你的配置中未包含,建议补充)。
xml
<!-- 1. 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>
<!-- 2. 启用注解驱动事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
使用示例 :在 Service 层添加 @Transactional 注解:
java
@Service
public class UserService {
@Transactional
public void updateUser(User user) {
userMapper.update(user);
}
}
七、完整配置参考
整合后的 spring.xml:
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 1. 组件扫描 -->
<context:component-scan base-package="cn.cjxy">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 2. 加载属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 3. 数据源配置 -->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
</bean>
<!-- 4. MyBatis 整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<property name="typeAliasesPackage" value="cn.cjxy.domain"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.cjxy.mapper"/>
</bean>
<!-- 5. 事务管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
八、常见问题与调试技巧
- 数据源连接失败
- 检查
jdbc.properties中的键名与 XML 中的${key}是否一致。 - 查看 Druid 日志:在
log4j.xml中配置com.alibaba.druid.pool日志级别为DEBUG。
- 检查
- Mapper 接口未注入
- 确保
MapperScannerConfigurer的basePackage路径正确。 - 检查 Mapper 接口是否在指定包下,且未被其他扫描策略排除。
- 确保
- 事务不生效
- 确认 Service 类和方法上添加了
@Transactional。 - 确保事务管理器 Bean 的
dataSource与数据源 Bean 的id一致。
- 确认 Service 类和方法上添加了
通过本教程,你已掌握如何从零构建 spring.xml 并整合 MyBatis 与事务管理。配置文件的核心在于 分层清晰、职责明确,通过注解驱动和外部化配置,显著提升代码可维护性。