<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明 XML 文档的版本和编码格式 -->

<beans xmlns="http://www.springframework.org/schema/beans"  <!-- 定义 Spring Beans 命名空间 -->
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  <!-- 定义 XML Schema 实例命名空间 -->
    xmlns:aop="http://www.springframework.org/schema/aop"  <!-- 定义 AOP 命名空间 -->
    xmlns:tx="http://www.springframework.org/schema/tx"  <!-- 定义事务管理命名空间 -->
    xmlns:context="http://www.springframework.org/schema/context"  <!-- 定义 Spring 上下文命名空间 -->
    xsi:schemaLocation="http://www.springframework.org/schema/beans  <!-- 定义 XML Schema 文件位置 -->
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  <!-- Beans schema 的位置 -->
    http://www.springframework.org/schema/tx  <!-- 事务管理 schema 的位置 -->
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd  <!-- 事务管理 schema 文件 -->
    http://www.springframework.org/schema/context  <!-- 上下文配置 schema 的位置 -->
    http://www.springframework.org/schema/context/spring-context-4.3.xsd  <!-- 上下文配置 schema 文件 -->
    http://www.springframework.org/schema/aop  <!-- AOP schema 的位置 -->
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">  <!-- AOP schema 文件 -->
    
    <!-- 读取 db.properties 配置文件中的数据库相关信息 -->
    <context:property-placeholder location="classpath:db.properties"/>
    
    <!-- 配置数据源，使用 Apache DBCP2 数据源 -->
    <bean id="dataSource" 
          class="org.apache.commons.dbcp2.BasicDataSource">
          
        <!-- 配置数据库连接驱动 -->
        <property name="driverClassName" value="${jdbc.driver}" />
        
        <!-- 配置数据库连接的 URL -->
        <property name="url" value="${jdbc.url}" />
        
        <!-- 配置数据库连接的用户名 -->
        <property name="username" value="${jdbc.username}" />
        
        <!-- 配置数据库连接的密码 -->
        <property name="password" value="${jdbc.password}" />
        
        <!-- 配置最大连接数 -->
        <property name="maxTotal" value="${jdbc.maxTotal}" />
        
        <!-- 配置最大空闲连接数 -->
        <property name="maxIdle" value="${jdbc.maxIdle}" />
        
        <!-- 配置初始化连接数 -->
        <property name="initialSize" value="${jdbc.initialSize}" />
    </bean>
    
    <!-- 配置事务管理器，依赖于上面定义的数据源 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据源到事务管理器 -->
        <property name="dataSource" ref="dataSource" />
    </bean>    
    
    <!-- 开启事务注解支持，指定事务管理器 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <!-- 配置 MyBatis 的 SqlSessionFactory，负责创建数据库会话 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         <!-- 注入数据源到 SqlSessionFactory -->
         <property name="dataSource" ref="dataSource" />
         
         <!-- 配置 MyBatis 核心配置文件的位置 -->
         <property name="configLocation" value="classpath:mybatis-config.xml" />
    </bean>
    
    <!-- 配置 MyBatis 的 Mapper 扫描器，用于自动扫描 DAO 接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 配置要扫描的包，扫描所有 Mapper 接口 -->
        <property name="basePackage" value="com.itheima.dao"/>
    </bean>
    
    <!-- 扫描并加载 Service 层的 Bean -->
    <context:component-scan base-package="com.itheima.service" />
</beans>
