diff --git a/src/main/java/org/mybatis/spring/annotation/MapperScan.java b/src/main/java/org/mybatis/spring/annotation/MapperScan.java index 7bdf3abccd..ee587e1775 100644 --- a/src/main/java/org/mybatis/spring/annotation/MapperScan.java +++ b/src/main/java/org/mybatis/spring/annotation/MapperScan.java @@ -154,4 +154,16 @@ */ Class extends MapperFactoryBean> factoryBean() default MapperFactoryBean.class; + /** + * Whether enable lazy initialization of mapper bean. + * + *
+ * Default is {@code false}. + *
+ * + * @return set {@code true} to enable lazy initialization + * @since 2.0.2 + */ + String lazyInitialization() default ""; + } diff --git a/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java b/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java index 489113930c..af99f0406f 100644 --- a/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java +++ b/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java @@ -19,12 +19,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import org.mybatis.spring.mapper.ClassPathMapperScanner; import org.mybatis.spring.mapper.MapperFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.context.ResourceLoaderAware; @@ -50,14 +51,15 @@ */ public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware { - private ResourceLoader resourceLoader; - /** * {@inheritDoc} + * + * @deprecated Since 2.0.2, this method not used never. */ @Override + @Deprecated public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; + // NOP } /** @@ -68,39 +70,44 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B AnnotationAttributes mapperScanAttrs = AnnotationAttributes .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName())); if (mapperScanAttrs != null) { - registerBeanDefinitions(mapperScanAttrs, registry); + registerBeanDefinitions(mapperScanAttrs, registry, generateBaseBeanName(importingClassMetadata, 0)); } } - void registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegistry registry) { - - ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry); + void registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegistry registry, String beanName) { - // this check is needed in Spring 3.1 - Optional.ofNullable(resourceLoader).ifPresent(scanner::setResourceLoader); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class); + builder.addPropertyValue("processPropertyPlaceHolders", true); Class extends Annotation> annotationClass = annoAttrs.getClass("annotationClass"); if (!Annotation.class.equals(annotationClass)) { - scanner.setAnnotationClass(annotationClass); + builder.addPropertyValue("annotationClass", annotationClass); } Class> markerInterface = annoAttrs.getClass("markerInterface"); if (!Class.class.equals(markerInterface)) { - scanner.setMarkerInterface(markerInterface); + builder.addPropertyValue("markerInterface", markerInterface); } Class extends BeanNameGenerator> generatorClass = annoAttrs.getClass("nameGenerator"); if (!BeanNameGenerator.class.equals(generatorClass)) { - scanner.setBeanNameGenerator(BeanUtils.instantiateClass(generatorClass)); + builder.addPropertyValue("nameGenerator", BeanUtils.instantiateClass(generatorClass)); } Class extends MapperFactoryBean> mapperFactoryBeanClass = annoAttrs.getClass("factoryBean"); if (!MapperFactoryBean.class.equals(mapperFactoryBeanClass)) { - scanner.setMapperFactoryBeanClass(mapperFactoryBeanClass); + builder.addPropertyValue("mapperFactoryBeanClass", mapperFactoryBeanClass); } - scanner.setSqlSessionTemplateBeanName(annoAttrs.getString("sqlSessionTemplateRef")); - scanner.setSqlSessionFactoryBeanName(annoAttrs.getString("sqlSessionFactoryRef")); + String sqlSessionTemplateRef = annoAttrs.getString("sqlSessionTemplateRef"); + if (StringUtils.hasText(sqlSessionTemplateRef)) { + builder.addPropertyValue("sqlSessionTemplateBeanName", annoAttrs.getString("sqlSessionTemplateRef")); + } + + String sqlSessionFactoryRef = annoAttrs.getString("sqlSessionFactoryRef"); + if (StringUtils.hasText(sqlSessionFactoryRef)) { + builder.addPropertyValue("sqlSessionFactoryBeanName", annoAttrs.getString("sqlSessionFactoryRef")); + } List+ * Default is {@code false}. + *
+ * + * @param lazyInitialization + * Set the @{code true} to enable + * @since 2.0.2 + */ + public void setLazyInitialization(boolean lazyInitialization) { + this.lazyInitialization = lazyInitialization; + } + public void setMarkerInterface(Class> markerInterface) { this.markerInterface = markerInterface; } @@ -220,6 +236,7 @@ private void processBeanDefinitions(Set+ * Default is {@code false}. + *
+ * + * @param lazyInitialization + * Set the @{code true} to enable + * @since 2.0.2 + */ + public void setLazyInitialization(String lazyInitialization) { + this.lazyInitialization = lazyInitialization; + } + /** * This property specifies the annotation that the scanner will search for. *
@@ -331,6 +349,9 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
scanner.setResourceLoader(this.applicationContext);
scanner.setBeanNameGenerator(this.nameGenerator);
scanner.setMapperFactoryBeanClass(this.mapperFactoryBeanClass);
+ if (StringUtils.hasText(lazyInitialization)) {
+ scanner.setLazyInitialization(Boolean.valueOf(lazyInitialization));
+ }
scanner.registerFilters();
scanner.scan(
StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));
@@ -364,7 +385,19 @@ private void processPropertyPlaceHolders() {
this.basePackage = updatePropertyValue("basePackage", values);
this.sqlSessionFactoryBeanName = updatePropertyValue("sqlSessionFactoryBeanName", values);
this.sqlSessionTemplateBeanName = updatePropertyValue("sqlSessionTemplateBeanName", values);
+ this.lazyInitialization = updatePropertyValue("lazyInitialization", values);
}
+ this.basePackage = Optional.ofNullable(this.basePackage).map(getEnvironment()::resolvePlaceholders).orElse(null);
+ this.sqlSessionFactoryBeanName = Optional.ofNullable(this.sqlSessionFactoryBeanName)
+ .map(getEnvironment()::resolvePlaceholders).orElse(null);
+ this.sqlSessionTemplateBeanName = Optional.ofNullable(this.sqlSessionTemplateBeanName)
+ .map(getEnvironment()::resolvePlaceholders).orElse(null);
+ this.lazyInitialization = Optional.ofNullable(this.lazyInitialization).map(getEnvironment()::resolvePlaceholders)
+ .orElse(null);
+ }
+
+ private Environment getEnvironment() {
+ return this.applicationContext.getEnvironment();
}
private String updatePropertyValue(String propertyName, PropertyValues values) {
diff --git a/src/main/java/org/mybatis/spring/config/mybatis-spring.xsd b/src/main/resources/org/mybatis/spring/config/mybatis-spring.xsd
similarity index 93%
rename from src/main/java/org/mybatis/spring/config/mybatis-spring.xsd
rename to src/main/resources/org/mybatis/spring/config/mybatis-spring.xsd
index b1e87ecac5..fcd5843065 100644
--- a/src/main/java/org/mybatis/spring/config/mybatis-spring.xsd
+++ b/src/main/resources/org/mybatis/spring/config/mybatis-spring.xsd
@@ -130,6 +130,15 @@
+
@@ -78,6 +80,9 @@ void testInterfaceScan() {
startContext();
+ SqlSessionFactory sqlSessionFactory = applicationContext.getBean(SqlSessionFactory.class);
+ assertEquals(5, sqlSessionFactory.getConfiguration().getMapperRegistry().getMappers().size());
+
// all interfaces with methods should be loaded
applicationContext.getBean("mapperInterface");
applicationContext.getBean("mapperSubinterface");
@@ -195,6 +200,26 @@ void testScanWithMapperFactoryBeanClass() {
assertTrue(DummyMapperFactoryBean.getMapperCount() > 0);
}
+ @Test
+ void testLazy() {
+
+ applicationContext = new ClassPathXmlApplicationContext(new String[] { "org/mybatis/spring/config/lazy.xml" },
+ setupSqlSessionTemplate());
+
+ startContext();
+
+ SqlSessionFactory sqlSessionFactory = applicationContext.getBean(SqlSessionFactory.class);
+ assertEquals(0, sqlSessionFactory.getConfiguration().getMapperRegistry().getMappers().size());
+
+ // all interfaces with methods should be loaded
+ applicationContext.getBean("mapperInterface");
+ applicationContext.getBean("mapperSubinterface");
+ applicationContext.getBean("mapperChildInterface");
+ applicationContext.getBean("annotatedMapper");
+
+ assertEquals(4, sqlSessionFactory.getConfiguration().getMapperRegistry().getMappers().size());
+ }
+
private GenericApplicationContext setupSqlSessionTemplate() {
GenericApplicationContext genericApplicationContext = setupSqlSessionFactory();
diff --git a/src/test/java/org/mybatis/spring/config/lazy.properties b/src/test/java/org/mybatis/spring/config/lazy.properties
new file mode 100644
index 0000000000..b9ab31ec7e
--- /dev/null
+++ b/src/test/java/org/mybatis/spring/config/lazy.properties
@@ -0,0 +1,17 @@
+#
+# Copyright 2010-2019 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+mybatis.lazy-initialization=true
\ No newline at end of file
diff --git a/src/test/java/org/mybatis/spring/config/lazy.xml b/src/test/java/org/mybatis/spring/config/lazy.xml
new file mode 100644
index 0000000000..5f9e7aeffb
--- /dev/null
+++ b/src/test/java/org/mybatis/spring/config/lazy.xml
@@ -0,0 +1,29 @@
+
+
+