@MapperScan扫描包里混有@Service等问题怎么办(@mapperscan,@service,开发技术)

时间:2024-04-29 22:42:43 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

@MapperScan扫描包混有@Service

问题描述

@MapperScan注解配置的一般是dao或者mapper的扫描包,一般用于数据库操作,里面类的一般都是接口,如果在dao层有其他接口,比如说@Service等就会报错

@MapperScan扫描包里混有@Service等问题怎么办

解决办法一

把service包移走,方法可行

解决办法二

不使用@MapperScan,在每个dao或者mapper里面加上注解@Mapper,方法可行

解决办法三

使用自定义注解,在mybatis的注解比较完善的情况下,就不用自己搞多少

创建注解@MyMapperScan

里面的属性全部抄袭@MapperScan

MapperScannerRegistrar换成自己的

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(MyMapperScannerRegistrar.class)@Repeatable(MapperScans.class)public@interfaceMapperScan{String[]value()default{};String[]basePackages()default{};Class<?>[]basePackageClasses()default{};Class<?extendsBeanNameGenerator>nameGenerator()defaultBeanNameGenerator.class;Class<?extendsAnnotation>annotationClass()defaultAnnotation.class;Class<?>markerInterface()defaultClass.class;StringsqlSessionTemplateRef()default"";StringsqlSessionFactoryRef()default"";Class<?extendsMapperFactoryBean>factoryBean()defaultMapperFactoryBean.class;StringlazyInitialization()default"";}

MyMapperScannerRegistrar扫描注册器

这个类和mybatis的一模一样,唯一的不同就是MyClassPathMapperScanner是自己的扫描

publicclassMyMapperScannerRegistrarextendsMapperScannerRegistrar{privateResourceLoaderresourceLoader;/***{@inheritDoc}*/@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){AnnotationAttributesannoAttrs=AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));//这个是自己的ClassPathMapperScannerscanner=newMyClassPathMapperScanner(registry);//thischeckisneededinSpring3.1if(resourceLoader!=null){scanner.setResourceLoader(resourceLoader);}Class<?extendsAnnotation>annotationClass=annoAttrs.getClass("annotationClass");if(!Annotation.class.equals(annotationClass)){scanner.setAnnotationClass(annotationClass);}Class<?>markerInterface=annoAttrs.getClass("markerInterface");if(!Class.class.equals(markerInterface)){scanner.setMarkerInterface(markerInterface);}Class<?extendsBeanNameGenerator>generatorClass=annoAttrs.getClass("nameGenerator");if(!BeanNameGenerator.class.equals(generatorClass)){scanner.setBeanNameGenerator(BeanUtils.instantiateClass(generatorClass));}Class<?extendsMapperFactoryBean>mapperFactoryBeanClass=annoAttrs.getClass("factoryBean");if(!MapperFactoryBean.class.equals(mapperFactoryBeanClass)){scanner.setMapperFactoryBean(BeanUtils.instantiateClass(mapperFactoryBeanClass));}scanner.setSqlSessionTemplateBeanName(annoAttrs.getString("sqlSessionTemplateRef"));scanner.setSqlSessionFactoryBeanName(annoAttrs.getString("sqlSessionFactoryRef"));List<String>basePackages=newArrayList<String>();for(Stringpkg:annoAttrs.getStringArray("value")){if(StringUtils.hasText(pkg)){basePackages.add(pkg);}}for(Stringpkg:annoAttrs.getStringArray("basePackages")){if(StringUtils.hasText(pkg)){basePackages.add(pkg);}}for(Class<?>clazz:annoAttrs.getClassArray("basePackageClasses")){basePackages.add(ClassUtils.getPackageName(clazz));}scanner.registerFilters();scanner.doScan(StringUtils.toStringArray(basePackages));}/***{@inheritDoc}*/@OverridepublicvoidsetResourceLoader(ResourceLoaderresourceLoader){this.resourceLoader=resourceLoader;}}

MyClassPathMapperScanner

自己的扫描类基本也是mybatis的,就是在判断上面改动了一点点

publicclassMyClassPathMapperScannerextendsClassPathMapperScanner{publicMyClassPathMapperScanner(BeanDefinitionRegistryregistry){super(registry);}@OverrideprotectedbooleanisCandidateComponent(AnnotatedBeanDefinitionbeanDefinition){booleanflag=super.isCandidateComponent(beanDefinition);//包名带有Mapper的才会被mybatis代理booleanmapper=beanDefinition.getBeanClassName().contains("Mapper");returnflag&&mapper;}}

现在只需要用自己的扫描注解即可,用法和mybatis的一模一样

解决办法四

这个是针对第三点的,作者使用第三点的时候mybatis版本为3.4.6

mybatis-spring版本为1.3.2,spring版本为5.x

当mybatis版本为3.5.2的mybatis-spring版本为2.0.2的时候

MapperScannerRegistrar类扫描的方式发生了一点点变化,

还需要改写MapperScannerConfigurer类,其他的不变

完毕!

解决办法五

@MapperScan注解使用markerInterface或者annotationClass参数限制扫描的接口

@MapperScan包扫描的坑

在使用通用mapper执行查询时

由于不太注意顺手就导了spring的包:

importorg.mybatis.spring.annotation.MapperScan;

结果就异常:

tk.mybatis.mapper.provider.base.BaseSelectProvider:xxxx

找了半天才发现是包的问题

应该导mybatis的MapperScan而不是spring中的包,正确的包名:

importtk.mybatis.spring.annotation.MapperScan;
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:@MapperScan扫描包里混有@Service等问题怎么办的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:下一篇:

9 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18