19
19
import java .util .ArrayList ;
20
20
import java .util .Arrays ;
21
21
import java .util .List ;
22
- import java .util .Optional ;
23
22
import java .util .stream .Collectors ;
24
23
25
24
import org .mybatis .spring .mapper .ClassPathMapperScanner ;
26
25
import org .mybatis .spring .mapper .MapperFactoryBean ;
26
+ import org .mybatis .spring .mapper .MapperScannerConfigurer ;
27
27
import org .springframework .beans .BeanUtils ;
28
+ import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
28
29
import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
29
30
import org .springframework .beans .factory .support .BeanNameGenerator ;
30
31
import org .springframework .context .ResourceLoaderAware ;
50
51
*/
51
52
public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar , ResourceLoaderAware {
52
53
53
- private ResourceLoader resourceLoader ;
54
-
55
54
/**
56
55
* {@inheritDoc}
56
+ *
57
+ * @deprecated Since 2.0.2, this method not used never.
57
58
*/
58
59
@ Override
60
+ @ Deprecated
59
61
public void setResourceLoader (ResourceLoader resourceLoader ) {
60
- this . resourceLoader = resourceLoader ;
62
+ // NOP
61
63
}
62
64
63
65
/**
@@ -68,39 +70,44 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
68
70
AnnotationAttributes mapperScanAttrs = AnnotationAttributes
69
71
.fromMap (importingClassMetadata .getAnnotationAttributes (MapperScan .class .getName ()));
70
72
if (mapperScanAttrs != null ) {
71
- registerBeanDefinitions (mapperScanAttrs , registry );
73
+ registerBeanDefinitions (mapperScanAttrs , registry , generateBaseBeanName ( importingClassMetadata , 0 ) );
72
74
}
73
75
}
74
76
75
- void registerBeanDefinitions (AnnotationAttributes annoAttrs , BeanDefinitionRegistry registry ) {
76
-
77
- ClassPathMapperScanner scanner = new ClassPathMapperScanner (registry );
77
+ void registerBeanDefinitions (AnnotationAttributes annoAttrs , BeanDefinitionRegistry registry , String beanName ) {
78
78
79
- // this check is needed in Spring 3.1
80
- Optional . ofNullable ( resourceLoader ). ifPresent ( scanner :: setResourceLoader );
79
+ BeanDefinitionBuilder builder = BeanDefinitionBuilder . genericBeanDefinition ( MapperScannerConfigurer . class );
80
+ builder . addPropertyValue ( "processPropertyPlaceHolders" , true );
81
81
82
82
Class <? extends Annotation > annotationClass = annoAttrs .getClass ("annotationClass" );
83
83
if (!Annotation .class .equals (annotationClass )) {
84
- scanner . setAnnotationClass ( annotationClass );
84
+ builder . addPropertyValue ( "annotationClass" , annotationClass );
85
85
}
86
86
87
87
Class <?> markerInterface = annoAttrs .getClass ("markerInterface" );
88
88
if (!Class .class .equals (markerInterface )) {
89
- scanner . setMarkerInterface ( markerInterface );
89
+ builder . addPropertyValue ( "markerInterface" , markerInterface );
90
90
}
91
91
92
92
Class <? extends BeanNameGenerator > generatorClass = annoAttrs .getClass ("nameGenerator" );
93
93
if (!BeanNameGenerator .class .equals (generatorClass )) {
94
- scanner . setBeanNameGenerator ( BeanUtils .instantiateClass (generatorClass ));
94
+ builder . addPropertyValue ( "nameGenerator" , BeanUtils .instantiateClass (generatorClass ));
95
95
}
96
96
97
97
Class <? extends MapperFactoryBean > mapperFactoryBeanClass = annoAttrs .getClass ("factoryBean" );
98
98
if (!MapperFactoryBean .class .equals (mapperFactoryBeanClass )) {
99
- scanner . setMapperFactoryBeanClass ( mapperFactoryBeanClass );
99
+ builder . addPropertyValue ( "mapperFactoryBeanClass" , mapperFactoryBeanClass );
100
100
}
101
101
102
- scanner .setSqlSessionTemplateBeanName (annoAttrs .getString ("sqlSessionTemplateRef" ));
103
- scanner .setSqlSessionFactoryBeanName (annoAttrs .getString ("sqlSessionFactoryRef" ));
102
+ String sqlSessionTemplateRef = annoAttrs .getString ("sqlSessionTemplateRef" );
103
+ if (StringUtils .hasText (sqlSessionTemplateRef )) {
104
+ builder .addPropertyValue ("sqlSessionTemplateBeanName" , annoAttrs .getString ("sqlSessionTemplateRef" ));
105
+ }
106
+
107
+ String sqlSessionFactoryRef = annoAttrs .getString ("sqlSessionFactoryRef" );
108
+ if (StringUtils .hasText (sqlSessionFactoryRef )) {
109
+ builder .addPropertyValue ("sqlSessionFactoryBeanName" , annoAttrs .getString ("sqlSessionFactoryRef" ));
110
+ }
104
111
105
112
List <String > basePackages = new ArrayList <>();
106
113
basePackages .addAll (
@@ -112,8 +119,19 @@ void registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegis
112
119
basePackages .addAll (Arrays .stream (annoAttrs .getClassArray ("basePackageClasses" )).map (ClassUtils ::getPackageName )
113
120
.collect (Collectors .toList ()));
114
121
115
- scanner .registerFilters ();
116
- scanner .doScan (StringUtils .toStringArray (basePackages ));
122
+ String lazyInitialization = annoAttrs .getString ("lazyInitialization" );
123
+ if (StringUtils .hasText (lazyInitialization )) {
124
+ builder .addPropertyValue ("lazyInitialization" , lazyInitialization );
125
+ }
126
+
127
+ builder .addPropertyValue ("basePackage" , StringUtils .collectionToCommaDelimitedString (basePackages ));
128
+
129
+ registry .registerBeanDefinition (beanName , builder .getBeanDefinition ());
130
+
131
+ }
132
+
133
+ private static String generateBaseBeanName (AnnotationMetadata importingClassMetadata , int index ) {
134
+ return importingClassMetadata .getClassName () + "#" + MapperScannerRegistrar .class .getSimpleName () + "#" + index ;
117
135
}
118
136
119
137
/**
@@ -130,8 +148,10 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
130
148
AnnotationAttributes mapperScansAttrs = AnnotationAttributes
131
149
.fromMap (importingClassMetadata .getAnnotationAttributes (MapperScans .class .getName ()));
132
150
if (mapperScansAttrs != null ) {
133
- Arrays .stream (mapperScansAttrs .getAnnotationArray ("value" ))
134
- .forEach (mapperScanAttrs -> registerBeanDefinitions (mapperScanAttrs , registry ));
151
+ AnnotationAttributes [] annotations = mapperScansAttrs .getAnnotationArray ("value" );
152
+ for (int i = 0 ; i < annotations .length ; i ++) {
153
+ registerBeanDefinitions (annotations [i ], registry , generateBaseBeanName (importingClassMetadata , i ));
154
+ }
135
155
}
136
156
}
137
157
}
0 commit comments