Skip to content

Commit aa5de2f

Browse files
committed
Scan mappers from the package of the class that declares MapperScan annotation if basePackages attrubute is not present
1 parent f1dece4 commit aa5de2f

File tree

4 files changed

+40
-3
lines changed

4 files changed

+40
-3
lines changed

src/main/java/org/mybatis/spring/annotation/MapperScan.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
/**
3232
* Use this annotation to register MyBatis mapper interfaces when using Java Config. It performs when same work as
3333
* {@link MapperScannerConfigurer} via {@link MapperScannerRegistrar}.
34+
*
35+
* <p>Either {@link #basePackageClasses} or {@link #basePackages} (or its alias
36+
* {@link #value}) may be specified to define specific packages to scan. If specific
37+
* packages are not defined, scanning will occur from the package of the
38+
* class that declares this annotation.
3439
*
3540
* <p>
3641
* Configuration example:

src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,11 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
7070
AnnotationAttributes mapperScanAttrs = AnnotationAttributes
7171
.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));
7272
if (mapperScanAttrs != null) {
73-
registerBeanDefinitions(mapperScanAttrs, registry, generateBaseBeanName(importingClassMetadata, 0));
73+
registerBeanDefinitions(mapperScanAttrs, registry, generateBaseBeanName(importingClassMetadata, 0), getDefaultBasePackage(importingClassMetadata));
7474
}
7575
}
7676

77-
void registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegistry registry, String beanName) {
77+
void registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegistry registry, String beanName, String defaultBasePackage) {
7878

7979
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);
8080
builder.addPropertyValue("processPropertyPlaceHolders", true);
@@ -119,6 +119,10 @@ void registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegis
119119
basePackages.addAll(Arrays.stream(annoAttrs.getClassArray("basePackageClasses")).map(ClassUtils::getPackageName)
120120
.collect(Collectors.toList()));
121121

122+
if (basePackages.isEmpty()) {
123+
basePackages.add(defaultBasePackage);
124+
}
125+
122126
String lazyInitialization = annoAttrs.getString("lazyInitialization");
123127
if (StringUtils.hasText(lazyInitialization)) {
124128
builder.addPropertyValue("lazyInitialization", lazyInitialization);
@@ -134,6 +138,10 @@ private static String generateBaseBeanName(AnnotationMetadata importingClassMeta
134138
return importingClassMetadata.getClassName() + "#" + MapperScannerRegistrar.class.getSimpleName() + "#" + index;
135139
}
136140

141+
private static String getDefaultBasePackage(AnnotationMetadata importingClassMetadata) {
142+
return ClassUtils.getPackageName(importingClassMetadata.getClassName());
143+
}
144+
137145
/**
138146
* A {@link MapperScannerRegistrar} for {@link MapperScans}.
139147
*
@@ -150,7 +158,7 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
150158
if (mapperScansAttrs != null) {
151159
AnnotationAttributes[] annotations = mapperScansAttrs.getAnnotationArray("value");
152160
for (int i = 0; i < annotations.length; i++) {
153-
registerBeanDefinitions(annotations[i], registry, generateBaseBeanName(importingClassMetadata, i));
161+
registerBeanDefinitions(annotations[i], registry, generateBaseBeanName(importingClassMetadata, i), getDefaultBasePackage(importingClassMetadata));
154162
}
155163
}
156164
}

src/test/java/org/mybatis/spring/annotation/MapperScanTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.mybatis.spring.SqlSessionTemplate;
2929
import org.mybatis.spring.annotation.mapper.ds1.Ds1Mapper;
3030
import org.mybatis.spring.mapper.AnnotatedMapper;
31+
import org.mybatis.spring.mapper.AppConfigWithDefaultPackageScan;
3132
import org.mybatis.spring.mapper.MapperInterface;
3233
import org.mybatis.spring.mapper.MapperSubinterface;
3334
import org.mybatis.spring.mapper.child.MapperChildInterface;
@@ -90,6 +91,19 @@ void assertNoMapperClass() {
9091
}
9192
}
9293

94+
@Test
95+
void testDefaultMapperScan() {
96+
applicationContext.register(AppConfigWithDefaultPackageScan.class);
97+
98+
startContext();
99+
100+
// all interfaces with methods should be loaded
101+
applicationContext.getBean("mapperInterface");
102+
applicationContext.getBean("mapperSubinterface");
103+
applicationContext.getBean("mapperChildInterface");
104+
applicationContext.getBean("annotatedMapper");
105+
}
106+
93107
@Test
94108
void testInterfaceScan() {
95109
applicationContext.register(AppConfigWithPackageScan.class);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.mybatis.spring.mapper;
2+
3+
import org.mybatis.spring.annotation.MapperScan;
4+
import org.springframework.context.annotation.Configuration;
5+
6+
@Configuration
7+
@MapperScan
8+
public class AppConfigWithDefaultPackageScan {
9+
10+
}

0 commit comments

Comments
 (0)