Spring使用xml方式整合第三方框架流程详解

一、概述

xml整合第三方框架有两种整合方案:

  • 不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如:MyBatis;
  • 需要引入第三方框架命名空间,需要使用Spring的配置文件配置第三方框架本身内容,例如:Dubbo。

Spring整合MyBatis,之前已经在Spring中简单的配置了SqlSessionFactory, 但是这不是正规的整合方式,MyBatis提供了mybatis-spring.jar专门用于两大框架的整合。 Spring整合MyBatis的步骤如下:

  • 导入MyBatis整合Spring的相关坐标;(请见资料中的pom.xml)
  • 编写Mapper和Mapperxml;
  • 配置SqlSessionFactoryBean和MapperScannerConfigurer;
  • 编写测试代码

二、代码演示

①:原始方式使用Mybatis

1.创建BookMapper类和BookMapper.xml文件

package com.tangyuan.mapper;
import com.tangyuan.pojo.Book;
import java.util.List;
public interface BookMapper {
      List findAll();
}


    

2.在mybatis-config.xml中引用文件



    
        
            
            
                
                
                
                
            
        
    
    
        
    

3.编写原始测试代码

package com.tangyuan.test;
import com.tangyuan.mapper.BookMapper;
import com.tangyuan.pojo.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisTest {
    public static void main(String[] args) throws Exception {
        //读取配置文件
        //静态工厂方法方式
        InputStream resource = Resources.getResourceAsStream("mybatis-config.xml");
        //设置构造器
        //无参构造实例化
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        //构建工厂
        //实例工厂方法
        SqlSessionFactory build = builder.build(resource);
        SqlSession sqlSession = build.openSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        List all = mapper.findAll();
          for (Book a:all){
              System.out.println(a);
          }
    }
}

1.在pom文件引入依赖


  org.mybatis
  mybatis-spring
  2.0.7


  org.springframework
  spring-jdbc
  5.3.20

2.在主xml文件中进行文件的配置

 
     
          
     


    
    
    
    

   
 
  
 

3.在需要方法的类上调用方法

//需要Mapper,直接注入Mapper和提供set方法
private BookMapper bookMapper;
public void setBookMapper(BookMapper bookMapper) {
    this.bookMapper = bookMapper;
}
//输出集合
@Override
public  void  show(){
    List all = bookMapper.findAll();
        all.forEach(System.out::println);
  }

4.在xml文件上进行bean的配置


    

 

5.测试

//创建ApplicationContext,加载配置文件,实例化容器
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
IUserService userService = (IUserService) applicationContext.getBean("userService");
userService.show();

三、Spring整合MyBatis的原理剖析

整合包里提供了一个SqlSessionFactoryBean和一个扫描Mapper的配置对象,SqlSessionFactoryBean一旦被实例化, 就开始扫描Mapper并通过动态代理产生Mapper的实现类存储到Spring容器中。相关的有如下四个类:

  • SqlSessionFactoryBean:需要进行配置, 用于提供SqlSessionFactory;
  • MapperScannerConfigurer:需要进行配置,用于扫描指定mapper注册BeanDefinition;
  • MapperFactoryBean:Mapper的FactoryBean, 获得指定Mapper时调用getObject方法;
  • ClassPathMapperScanner:definition.setAutowireMode(2) 修改了自动注入状态,所以 MapperFactoryBean中的setSqlSessionFactory会自动注入进去。

Spring整合其他组件时就不像MyBatis这么简单了, 例如Dubbo框架在于Spring进行整合时, 要使用Dubbo提供的命名空间的扩展方式, 自定义了一些Dubbo的标签









     

3.配置属性


    
    
    
    

外部命名空间标签的执行流程,如下:

  • 将自定义标签的约束与物理约束文件与网络约束名称的约束以键值对形式存储到一个spring.schemas文件里 , 该文件存储在类加载路径的META-INF里, Spring会自动加载到;
  • 将自定义命名空间的名称与自定义命名空间的处理器映射关系以键值对形式存在到一个叫spring.handlers文 件里, 该文件存储在类加载路径的META-INF里, Spring会自动加载到;
  • 准备好NamespaceHandler, 如果命名空间只有一个标签, 那么直接在parse方法中进行解析即可, 一般解析结 果就是注册该标签对应的BeanDefinition。如果命名空间里有多个标签, 那么可以在init方法中为每个标签都注 册一个BeanDefinitionParser, 在执行NamespaceHandler的parse方法时在分流给不同的 BeanDefinitionParser进行解析(重写doParse方法即可) 。

四、案例演示

设想自己是一名架构师, 进行某一个框架与Spring的集成开发, 效果是通过一个指示标签, 向Spring容器中自动注入一个BeanPostProcessor


     

步骤分析:

1.确定命名空间名称、schema虚拟路径、标签名称;

2.编写schema约束文件haohao-annotation.xsd

3.在类加载路径下创建META-INF目录, 编写约束映射文件spring.schemas和处理器映射文件spring.handlers

4.编写命名空间处理器HaohaoNamespaceHandler, 在init方法中注册HaohaoBeanDefinitionParser

5.编写标签的解析器HaohaoBeanDefinitionParser, 在parse方法中注册HaohaoBeanPostProcessor

6.编写HaohaoBeanPostProcessor

========以上五步是框架开发者写的,以下是框架使用者写的

1.在applicationContext.xml配置文件中引入命名空间

2.在applicationContext.xml配置文件中使用自定义的标签

代码演示:

1.确定命名空间名称、schema虚拟路径、标签名称;

2.编写schema约束文件haohao-annotation.xsd


    

3.在类加载路径下创建META-INF目录, 编写约束映射文件spring.schemas和处理器映射文件spring.handlers

http\://www.tangyuan.com/haohao/haohao-annotation.xsd=com/tangyuan/haohao/config/haohao-annotation.xsd

http\://www.tangyuan.com/haohao=com.tangyuan.handlers.HaohaoNamespaceHandler

4.编写命名空间处理器HaohaoNamespaceHandler, 在init方法中注册HaohaoBeanDefinitionParser

package com.tangyuan.handlers;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class HaohaoNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        //初始化,一般情况下,一个名空间下有多个标签,会在init方法中为每一个标签注册一个标签解析器
        this.registerBeanDefinitionParser("annotation-driven",new HaohaoBeanDefinitionParser());
    }
}

5.编写标签的解析器HaohaoBeanDefinitionParser, 在parse方法中注册HaohaoBeanPostProcessor

package com.tangyuan.handlers;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
public class HaohaoBeanDefinitionParser implements BeanDefinitionParser {
    @Override
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        //注入一个BeanPostProcessor
        BeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClassName("com.tangyuan.processor.HaohaoBeanPostProcessor");
        parserContext.getRegistry().registerBeanDefinition("haohaoBeanPostProessor",beanDefinition);
        return beanDefinition;
    }
}

6.编写HaohaoBeanPostProcessor

package com.tangyuan.processor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class HaohaoBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("HaohaoBeanPostProcessor执行....");
        return bean;
    }
}

7.在主xml文件引用


  
    

到此这篇关于Spring使用xml方式整合第三方框架流程详解的文章就介绍到这了,更多相关Spring整合第三方框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(Spring使用xml方式整合第三方框架流程详解)