Spring整合第三方框架

本文详细介绍了如何在Spring框架中整合MyBatis,重点讲解了SqlSessionFactory的管理以及如何在Junit单元测试中利用SpringTest。提到核心对象的选择,配置文件的解读,以及所需的依赖管理和单元测试设置。
摘要由CSDN通过智能技术生成

Spring整合第三方框架

结合 IOC 和 DI,整合2个常用技术

Spring整合MyBatis

整合 MyBatis 主要整合的是什么?就是将 MyBatis 用到的内容交给 Spring 管理

思路分析

对于 MyBatis 主要是两部分,一部分是核心对象,一部分是配置文件

首先说核心对象:

在这里插入图片描述

可以发现,这里面有三个对象,需要交给 Spring 管理,分别是 SqlSessionFactory、SqlSession、AccountDao,那么对这三个对象一一进行分析

  • AccountDao 是具体执行 Mapper 获得的一个结果对象,在不同的业务中,对象类型是不同的,所以它交给 Spring 管理其实是没有意义的,因为不同的业务中对象不同,我们无法确定一个对象的类型
  • SqlSession 是连接对象,它只是在工厂中打开(或者说取出)该对象来获取连接,说明该对象并不是它创建的(或者说在他开始使用之前就已经创建了出来),那么将他交给 Spring 来管理的意义也不大
  • SqlSessionFactory 是 SqlSession 对象的工厂方法,将它交给 Spring 来管理其实可以的,因为,之后的 SqlSession 对象和执行 Mapper 的结果对象都是以该方法为前提的

所以,真正需要交给 Spring 进行管理的是 SqlSessionFactory

接下来是配置文件:
在这里插入图片描述

说明:

  • 第一行读取外部 properties 配置文件,Spring 有提供具体的解决方案@PropertySource,需要交给 Spring
  • 第二行起别名包扫描,为 SqlSessionFactory 服务的,需要交给 Spring
  • 第三行主要用于做连接池,需要交给 Spring
  • 前面三行一起都是为了创建 SqlSession 对象用的,而 SqlSession 是由 SqlSessionFactory 创建出来的,所以只需要将 SqlSessionFactory 交给 Spring 管理即可。
  • 第四行是 Mapper 接口和映射文件[如果使用注解就没有该映射文件],这个是在获取到 SqlSession 以后执行具体操作的时候用,所以它和 SqlSessionFactory 创建的时机都不在同一个时间,可能需要单独管理。
整合
  1. 项目中导入需要整合的 jar 包

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
        
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        
        <dependency>
            <!--Spring操作数据库需要该jar包-->
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
        
        <dependency>
        <!--Spring与Mybatis整合的jar包这个jar包mybatis在前面,是Mybatis提供的-->
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>
    
  2. 创建 Spring 的主配置类

    //配置类注解
    @Configuration
    //包扫描,主要扫描的是项目中的AccountServiceImpl类
    @ComponentScan("com.XXX")
    public class SpringConfig {
    }
    
  3. 创建数据源的配置类

    public class JdbcConfig {
        @Value("${jdbc.driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String userName;
        @Value("${jdbc.password}")
        private String password;
        
        @Bean
        public DataSource dataSource(){
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName(driver);
            ds.setUrl(url);
            ds.setUsername(userName);
            ds.setPassword(password);
            return ds;
        }
    }
    
  4. 主配置类中读取 properties 并引入数据源配置类

    @Configuration
    @ComponentScan("com.XXX")
    @PropertySource("classpath:jdbc.properties")
    @Import(JdbcConfig.class)
    public class SpringConfig {
    }
    
  5. 创建 MyBatis 配置类并配置 sqlSessionFactory

    public class MybatisConfig {
        //定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
        @Bean
        public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
            SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
            //设置模型类的别名扫描
            ssfb.setTypeAliasesPackage("com.XXX.domain");
            //设置数据源
            ssfb.setDataSource(dataSource);
            return ssfb;
        }
        
        //定义bean,返回MapperScannerConfigurer对象
        @Bean
        public MapperScannerConfigurer mapperScannerConfigurer(){
            MapperScannerConfigurer msc = new MapperScannerConfigurer();
            msc.setBasePackage("com.XXX.dao");
            return msc;
        }
    }
    
    • 使用 SqlSessionFactoryBean 封装 SqlSessionFactory 需要的环境信息

    • 在这里插入图片描述

    • SqlSessionFactoryBean 是 FactoryBean 的一个子类,在该类中将 SqlSessionFactory 的创建进行了封装,简化对象的创建,我们只需要将其需要的内容设置即可。

    • 方法中有一个参数为 dataSource,当前 Spring 容器中已经创建了 Druid 数据源,类型刚好是 DataSource 类型,此时在初始化 SqlSessionFactoryBean 这个对象的时候,发现需要使用 DataSource对象,而容器中刚好有这么一个对象,就自动加载了 DruidDataSource 对象。

    • 使用 MapperScannerConfigurer 加载 Dao 接口,创建代理对象保存到 IOC 容器中

    • 在这里插入图片描述

    • 这个 MapperScannerConfigurer 对象也是 MyBatis 提供的专用于整合的 jar 包中的类,用来处理原始配置文件中的 mappers 相关配置,加载数据层的 Mapper 接口类

    • MapperScannerConfigurer 有一个核心属性 basePackage,就是用来设置所扫描的包路径

  6. 主配置类中引入 MyBatis 配置类

    @Configuration
    @ComponentScan("com.XXX")
    @PropertySource("classpath:jdbc.properties")
    @Import({JdbcConfig.class,MybatisConfig.class})
    public class SpringConfig {
    }
    

支持 Spring 与 MyBatis 的整合主要用到的两个类分别是:

  • SqlSessionFactoryBean
  • MapperScannerConfigurer

Spring整合Junit

  1. 引入依赖

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    
  2. 编写测试类

    //设置类运行器
    @RunWith(SpringJUnit4ClassRunner.class)
    //设置Spring环境对应的配置类
    @ContextConfiguration(classes = {SpringConfiguration.class}) //加载配置类
    //@ContextConfiguration(locations={"classpath:applicationContext.xml"})//加载
    配置文件
    public class AccountServiceTest {
    //支持自动装配注入bean
        @Autowired
        private AccountService accountService;
        @Test
        public void testFindById(){
            System.out.println(accountService.findById(1));
        }
        @Test
        public void testFindAll(){
            System.out.println(accountService.findAll());
        }
    }
    

注意:

  • 单元测试,如果测试的是注解配置类,则使用@ContextConfiguration(classes = 配置 类.class)
  • 单元测试,如果测试的是配置文件,则使用@ContextConfiguration(locations={配置文件 名,...})
  • Junit 运行后是基于 Spring 环境运行的,所以 Spring 提供了一个专用的类运行器,这个务必要设置,这个类运行器就在 Spring 的测试专用包中提供的,导入的坐标就是这个东西 SpringJUnit4ClassRunner
  • 上面两个配置都是固定格式,当需要测试哪个 bean 时,使用自动装配加载对应的对象,下面的工作就和以前做Junit单元测试完全一样了
名称@RunWith
类型测试类注解
位置测试类上方
作用设置 Junit 运行器
属性value:运行所使用的运行器
名称@ContextConfiguration
类型测试类注解
位置测试类定义上方
作用设置 Junit 加载的 Spring 核心配置
属性classes:核心配置类,可以使用数组的格式设定加载多个配置类;locations:配置文件,可以使用数组的格式设定加载多个配置文件名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我可是万西西呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值