All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.starblues.extension.mybatis.MapperHandler Maven / Gradle / Ivy

package com.gitee.starblues.extension.mybatis;

import com.gitee.starblues.extension.mybatis.group.PluginMapperGroup;
import com.gitee.starblues.factory.PluginRegistryInfo;
import com.gitee.starblues.factory.process.pipe.bean.name.PluginAnnotationBeanNameGenerator;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.AnnotationScopeMetadataResolver;
import org.springframework.context.annotation.ScopeMetadata;
import org.springframework.context.annotation.ScopeMetadataResolver;
import org.springframework.context.support.GenericApplicationContext;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * Mapper 接口处理者
 * @author starBlues
 * @version 2.4.0
 */
public class MapperHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MapperHandler.class);

    private static final String MAPPER_INTERFACE_NAMES = "MybatisMapperInterfaceNames";

    private final ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver();


    public MapperHandler() {
    }

    /**
     * 处理插件中的Mapper
     * @param pluginRegistryInfo 插件信息
     * @param processMapper Mapper的具体处理者
     */
    public void processMapper(PluginRegistryInfo pluginRegistryInfo,
                              MapperHandler.ProcessMapper processMapper){
        GenericApplicationContext applicationContext = pluginRegistryInfo.getPluginApplicationContext();
        List> groupClasses = pluginRegistryInfo.getGroupClasses(PluginMapperGroup.GROUP_ID);
        if(groupClasses == null || groupClasses.isEmpty()){
            return;
        }
        String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId();
        Set beanNames = new HashSet<>();
        for (Class groupClass : groupClasses) {
            if (groupClass == null) {
                continue;
            }
            BeanNameGenerator beanNameGenerator = new PluginAnnotationBeanNameGenerator(pluginId);
            AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(groupClass);
            ScopeMetadata scopeMetadata = scopeMetadataResolver.resolveScopeMetadata(abd);
            abd.setScope(scopeMetadata.getScopeName());
            String beanName = beanNameGenerator.generateBeanName(abd, applicationContext);
            BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
            AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
            BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, applicationContext);
            try {
                processMapper.process(definitionHolder, groupClass);
                beanNames.add(beanName);
            } catch (Exception e) {
                LOGGER.error("process mapper '{}' error. {}", groupClass.getName(), e.getMessage(), e);
            }
        }
        pluginRegistryInfo.addExtension(MAPPER_INTERFACE_NAMES, beanNames);
    }


    /**
     * 公共注册生成代理Mapper接口
     * @param holder ignore
     * @param mapperClass ignore
     * @param sqlSessionFactory ignore
     * @param sqlSessionTemplate ignore
     */
    public void commonProcessMapper(BeanDefinitionHolder holder,
                                    Class mapperClass,
                                    SqlSessionFactory sqlSessionFactory,
                                    SqlSessionTemplate sqlSessionTemplate) {
        GenericBeanDefinition definition = (GenericBeanDefinition) holder.getBeanDefinition();
        definition.getConstructorArgumentValues().addGenericArgumentValue(mapperClass);
        definition.setBeanClass(MapperFactoryBean.class);
        definition.getPropertyValues().add("addToConfig", true);
        definition.getPropertyValues().add("sqlSessionFactory", sqlSessionFactory);
        definition.getPropertyValues().add("sqlSessionTemplate", sqlSessionTemplate);
        definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
    }



    @FunctionalInterface
    public interface ProcessMapper{
        void process(BeanDefinitionHolder holder, Class mapperClass) throws Exception;
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy