Spring学习笔记(二) - 通过XML配置整合框架

Spring学习笔记(二) - 通过XML配置整合框架

知识分子没文化
2021-11-07 / 0 评论 / 1,033 阅读 / 3,513 字数 / 正在检测是否收录...

目录:

pom.xml 文件中导入 Spring 的坐标依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

一、创建Webapp项目

在 IDEA 中根据 “maven-archetype-webapp” 模板创建 Webapp 项目:

03

创建基本项目结构:

04

src/main/resources 目录下新建一个 spring-config.xml 文件作为 Spring 的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--  Spring配置内容  -->

</beans>

二、加载properties文件

2.1、新建properties文件

src/main/resources 目录下新建一个配置数据库连接信息的配置文件 jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring_db
jdbc.username=root
jdbc.password=root

或者也可以把等号换成冒号:

jdbc.driver:com.mysql.jdbc.Driver
jdbc.url:jdbc:mysql://127.0.0.1:3306/spring_db?useSSL=false&amp;setUnicode=true&characterEncoding=utf8
jdbc.username:root
jdbc.password:root

2.2、指定要加载的properties文件

在 Spring 的 XML 配置文件中加载指定 properties 文件,写法有多种:

  • 加载资源路径(src/main/java/resources)下指定的一个 properties 文件:

    <context:property-placeholder location="classpath:jdbc.properties"/>
  • 也可以加载资源路径下的多个 properties 文件:

    <context:property-placeholder location="classpath:jdbc.properties,classpath:jdbc2.properties"/>
  • 使用通配符加载 properties 文件:在资源路径或 jar 包中搜索并加载所有 properties 文件

    <context:property-placeholder location="classpath*:*.properties"/>

再加上 system-properties-mode="NEVER",表示 Spring 容器在解析 properties 配置文件时,不使用系统属性来替换配置文件中的属性,从而避免系统属性对配置产生影响:

<context:property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>

2.3、读取properties文件属性值的方式

<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>

三、数据源对象(以Druid为例)

3.1、导入Druid数据源依赖坐标

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.22</version>
</dependency>

3.2、在XML文件中配置数据源对象为Spring管理的Bean

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <!-- 使用属性占位符 ${} 读取 properties 文件中的属性 -->
    <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="10"/>
    <!-- 最大连接池数量 -->
    <property name="maxActive" value="100"/>
    <!--
    超时时间
    设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。
    如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常
    -->
    <property name="maxWait" value="-1"/>
</bean>

四、整合MyBatis

4.1、导入依赖坐标

<!-- spring-jdbc -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>6.1.4</version>
</dependency>

<!-- mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.16</version>
</dependency>

<!-- mybatis-spring -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>3.0.3</version>
</dependency>

<!-- mysql -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

4.2、配置SqlSessionFactoryBean

SqlSessionFactoryBean 是 Spring 与 MyBatis 集成时使用的一个关键类,它实现了 Spring 的 FactoryBean<SqlSessionFactory> 接口,用于创建 SqlSessionFactory 对象。

<!-- 配置 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 注入数据源,dataSource是在前面配置的数据库连接池 -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 从类路径下加载在mybatis/mappers包和它的子包中所有的MyBatis映射器XML文件 -->
    <property name="mapperLocations" value="classpath*:com/wlplove/dao/*.xml"/>
    <!-- 为Java类型设置简短的名称,从而在MyBatis的映射器文件中直接使用这个名称,而不需要写完整的类名 -->
    <property name="typeAliasesPackage" value="com.wlplove.domain"/>

    <!-- 通过configLocation属性指定mybatis配置文件路径,不加入这个属性则使用Spring中的配置 -->
    <!--        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>-->

    <!--MyBbatis配置 -->
    <property name="configuration">
        <bean class="org.apache.ibatis.session.Configuration">
            <property name="mapUnderscoreToCamelCase" value="true"/>
            <property name="cacheEna bled" value="true"/>
            <property name="defaultExecutorType" value="SIMPLE"/>
            <!-- 指定MyBatis所用日志的具体实现 -->
            <property name="logImpl" value="org.apache.ibatis.logging.log4j2.Log4j2Impl"/>
        </bean>
    </property>
</bean>

4.3、配置MapperScannerConfigurer

MapperScannerConfigurer 是 Spring 框架中用于整合 MyBatis 的一个配置类,它可以扫描指定包下的 Mapper 接口,并将它们的实现类自动注入到 Spring IoC 容器中。

<bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- basePackage属性指定自动扫描Mapper接口所在的包 -->
    <property name="basePackage" value="com.wlplove.dao"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

五、整合Junit

导入 Junit 和 spring-test 的依赖坐标:

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.10.2</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

新建一个测试类:

// 在 JUnit 5 中集成 Spring 功能,如果是Junit4则换成@RunWith(SpringJunit4ClassRunner.class)
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = SpringConfig.class)
public class SpringTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void test() {
        User user = userMapper.select();
    }
}

六、整合Log4j

导入 Log4j 的依赖坐标:

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.23.1</version>
</dependency>

"src/main/java/resources" 下新建一个 Log4j 的配置文件 Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--  Configuration 具有 Appenders 和 Loggers 这两种子节点,每个子节点可以定义多个 -->
<configuration>

    <!-- Appender节点,具有 Console(控制台)、File(文件)、RoolingFile(滚动文件)这三种类型的子节点 -->
    <Appenders>
        <!-- 输出日志信息到控制台 -->
        <Console name="console" target="SYSTEM_OUT">
            <!--指定控制日志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </Console>

        <!-- File 节点用来定义输出到指定位置的文件的 Appender,会将所有内容写入到同一个文件中 -->
        <!-- append属性设置写入新的日志时是追加在原内容后面,还是清除所有内容之后再写入 -->
<!--        <File name="allLog" fileName="logs/AlliInOne.log" append="true">-->
<!--            <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>-->
<!--            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c{9.9.9.1}(%L) %m%n"/>-->
<!--        </File>-->

        <!-- RollingFile 节点,将日志写入文件,但是允许日志文件根据时间或大小进行滚动,从而避免单个文件过大 -->
        <!-- fileName 生成的初始日志文件  -->
        <RollingFile name="rollingFileInfo" fileName="logs/${date:yyyy-MM}/log-info-${date:yyyy-MM-dd}.log" filePattern="logs/${date:yyyy-MM}/log-info-%d{yyyy-MM-dd}-%i.log">
            <!-- ThresholdFilter 只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- PatternLayout 指定控制日志输出的格式,不设置默认为:%m%n -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
            <!-- Policies 滚动策略 -->
            <Policies>
                <!-- 按时间滚动 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 按大小滚动 -->
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy 设置一个文件下保存的日志文件数量,不设置则默认为同一文件夹下7个文件,超过这个数量后,最老的文件将被删除 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </Appenders>

    <!-- 在 Loggers 中引入上面定义好的 Appender -->
    <loggers>
        <!-- level指定日志级别,从低到高的优先级:
                ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
        -->
        <!-- 设置org.mybatis包下的日志只打印WARN及以上级别 -->
        <Logger name="org.mybatis" level="WARN" additivity="false">
            <appender-ref ref="console"/>
            <appender-ref ref="rollingFileInfo"/>
        </Logger>
        <!-- 设置org.springframework包下的日志只打印WARN及以上级别 -->
        <Logger name="org.springframework" level="WARN" additivity="false">
            <appender-ref ref="console"/>
            <appender-ref ref="rollingFileInfo"/>
        </Logger>

        <root level="DEBUG">
            <appender-ref ref="console"/>
            <appender-ref ref="rollingFileInfo"/>
        </root>
    </loggers>

</configuration>

Log4j 配置文件详解:彻底掌握Log4j2 - 蚂蚁小哥 - 博客园

修改 Spring 配置中的 SqlSessionFactoryBean,修改 MyBatis 使用的日志框架为 Log4j2:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 注入数据源,dataSource 是在前面配置的数据库连接池-->
    <property name="dataSource" ref="dataSource"/>
    <!--从类路径下加载在 mybatis/mappers 包和它的子包中所有的 MyBatis 映射器 XML 文件-->
    <property name="mapperLocations" value="classpath*:com/wlplove/dao/*.xml"/>
    <!-- 给包下的所有对象起一个别名,用这个别名直接引用,不需要再加包名 -->
    <property name="typeAliasesPackage" value="com.wlplove.entity"/>

    <!-- MyBbatis 配置 -->
    <property name="configuration">
        <bean class="org.apache.ibatis.session.Configuration">
            <!-- 指定 MyBatis 所用日志的具体实现 -->
            <property name="logImpl" value="org.apache.ibatis.logging.log4j2.Log4j2Impl"/>
        </bean>
    </property>
</bean>
1

评论 (0)

取消