首页 > 编程知识 正文

mapperscan注解失效,scan扫描仪怎么用

时间:2023-05-04 16:55:40 阅读:28387 作者:1608

@ mappers can @ mappers can ((com.kq.my batis.mapper ),' com.kq.my batis1. mapper ' } publicvoidregisterbeandefinition beandefinitionregistryregistry (annotationattributesmapperscanattrs=annotation attributes.from map (导入分类元数据映射扫描器!=null (注册beandefinitions (mapperscanattrs,registry,generatebasebeanname ) importingclassmetadata,0 ) ); }

缺省情况下,这是扫描com.kq.mybatis.mapper文件和com.kq.mybatis1.mapper包中的所有. clsss文件

@MapperScan指定标记器接口在此指定@MapperScan指定标记器接口将扫描实现该接口的标记器

@ mappers can (value={ ' com.kq.scan.my batis.mapper ',' com.kq.scan.mybatis1.mapper'}, mapper interface=mybatisbasemapper.class ) publicinterfaceaccountmapperextendsmybatisbasemapper { }此marker界面最终设置

@MapperScan指定annotation class @ mappers can (value={ ' com.kq.scan.my batis.mapper ',' com.kq.scan.my batis1. ) annotationClass=Mapper.class ) @ mapperpublicinterfaceusermapper { }此annotass

注意:如果@MapperScan同时指定了markerInterface和annotationClass元素,则只要满足一个条件,就可以满足两个条件而不是两个条件

mapperscannerregistrarbeandefinitionbuilderbuilder=beandefinitionbuilder.genericbeandefinition (builder.add property valuinition Class? extendsannotationannotationclass=anno attrs.getclass (annotation class ); if (! annotation.class.equals (annotationclass ) ) builder.addpropertyvalue )、annotation class ); //看这里marker接口类? marker接口=anno attrs.getclass (marker接口); if (! class.class.equals (标记接口) ) builder.add property value ('标记器接口',标记器接口); }

@ mapper scans @ mapper scans ({ @ mappers can ) ' com.kq.myBatis.mapper ' )、@ mappers can (com.kq.my batis1. mapper staticclassrepeatingregistrarextendsmapperscannerregistrar { @ overridepublicvoidregisterbeandefinitions (注释元数据)

AnnotationAttributes mapperScansAttrs = AnnotationAttributes .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScans.class.getName())); if (mapperScansAttrs != null) { AnnotationAttributes[] annotations = mapperScansAttrs.getAnnotationArray("value"); for (int i = 0; i < annotations.length; i++) { registerBeanDefinitions(annotations[i], registry, generateBaseBeanName(importingClassMetadata, i)); } } } }

使用@MapperScans,spring的bean定义,注册的MapperScannerRegistrar 有多个的,看上图

 

注意

每个@MapperScan最终都会初始化1个MapperScannerConfigurer,主要关键的属性basePackage、annotationClass、markerInterface

 

主要相关类 org.mybatis.spring.annotation.MapperScannerRegistrarorg.mybatis.spring.mapper.MapperScannerConfigurer 类图

 

总结

@MapperScan主要就是扫描得到mybatis的Mapper,并最终在Spring容器种初始化

 

未配置@MapperScan org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration /** * If mapper registering configuration or mapper scanning configuration not present, this configuration allow to scan * mappers based on the same component-scanning path as Spring Boot itself. */ @org.springframework.context.annotation.Configuration @Import(AutoConfiguredMapperScannerRegistrar.class) @ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class }) public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean { @Override public void afterPropertiesSet() { logger.debug( "Not found configuration for registering mapper bean using @MapperScan, MapperFactoryBean and MapperScannerConfigurer."); } }

重点看下面这句话

If mapper registering configuration or mapper scanning configuration not present, this configuration allow to scan
    mappers based on the same component-scanning path as Spring Boot itself.

(如果不存在mapper注册配置或mapper扫描配置,则此配置允许扫描mapper基于与Spring Boot本身相同的组件扫描路径。)

 

AutoConfiguredMapperScannerRegistrar 

org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

public static class AutoConfiguredMapperScannerRegistrar implements BeanFactoryAware, ImportBeanDefinitionRegistrar { private BeanFactory beanFactory; @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { if (!AutoConfigurationPackages.has(this.beanFactory)) { logger.debug("Could not determine auto-configuration package, automatic mapper scanning disabled."); return; } logger.debug("Searching for mappers annotated with @Mapper"); List<String> packages = AutoConfigurationPackages.get(this.beanFactory); if (logger.isDebugEnabled()) { packages.forEach(pkg -> logger.debug("Using auto-configuration base package '{}'", pkg)); } BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class); builder.addPropertyValue("processPropertyPlaceHolders", true); builder.addPropertyValue("annotationClass", Mapper.class); //指定扫描的注解 builder.addPropertyValue("basePackage", StringUtils.collectionToCommaDelimitedString(packages)); //和springboot一致 BeanWrapper beanWrapper = new BeanWrapperImpl(MapperScannerConfigurer.class); Stream.of(beanWrapper.getPropertyDescriptors()) // Need to mybatis-spring 2.0.2+ .filter(x -> x.getName().equals("lazyInitialization")).findAny() .ifPresent(x -> builder.addPropertyValue("lazyInitialization", "${mybatis.lazy-initialization:false}")); registry.registerBeanDefinition(MapperScannerConfigurer.class.getName(), builder.getBeanDefinition()); } }

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。