Skip to content

Commit ba72783

Browse files
authored
Merge pull request #470 from kazuki43zoo/gh-469_support-default-scope
Support 'mybatis.mapper-default-scope' as configuration property
2 parents 82482c0 + a1b7b10 commit ba72783

File tree

6 files changed

+69
-9
lines changed

6 files changed

+69
-9
lines changed

mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,16 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
232232
builder.addPropertyValue("annotationClass", Mapper.class);
233233
builder.addPropertyValue("basePackage", StringUtils.collectionToCommaDelimitedString(packages));
234234
BeanWrapper beanWrapper = new BeanWrapperImpl(MapperScannerConfigurer.class);
235-
Stream.of(beanWrapper.getPropertyDescriptors())
236-
// Need to mybatis-spring 2.0.2+
237-
.filter(x -> x.getName().equals("lazyInitialization")).findAny()
238-
.ifPresent(x -> builder.addPropertyValue("lazyInitialization", "${mybatis.lazy-initialization:false}"));
235+
Set<String> propertyNames = Stream.of(beanWrapper.getPropertyDescriptors()).map(PropertyDescriptor::getName)
236+
.collect(Collectors.toSet());
237+
if (propertyNames.contains("lazyInitialization")) {
238+
// Need to mybatis-spring 2.0.2+
239+
builder.addPropertyValue("lazyInitialization", "${mybatis.lazy-initialization:false}");
240+
}
241+
if (propertyNames.contains("defaultScope")) {
242+
// Need to mybatis-spring 2.0.6+
243+
builder.addPropertyValue("defaultScope", "${mybatis.mapper-default-scope:}");
244+
}
239245
registry.registerBeanDefinition(MapperScannerConfigurer.class.getName(), builder.getBeanDefinition());
240246
}
241247

mybatis-spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
"description": "Set whether enable lazy initialization for mapper bean.",
2525
"type": "java.lang.Boolean"
2626
},
27+
{
28+
"defaultValue": "",
29+
"name": "mybatis.mapper-default-scope",
30+
"description": "A default scope for mapper bean that scanned by auto-configure.",
31+
"type": "java.lang.String"
32+
},
2733
{
2834
"name": "mybatis.scripting-language-driver.velocity.userdirective",
2935
"deprecation": {

mybatis-spring-boot-autoconfigure/src/site/markdown/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ Available properties are:
148148
| `default-scripting-language-driver` | The default scripting language driver class. This feature requires to use together with mybatis-spring 2.0.2+. |
149149
| `configuration-properties` | Externalized properties for MyBatis configuration. Specified properties can be used as placeholder on MyBatis config file and Mapper file. For detail see the [MyBatis reference page](http://www.mybatis.org/mybatis-3/configuration.html#properties). |
150150
| `lazy-initialization` | Whether enable lazy initialization of mapper bean. Set `true` to enable lazy initialization. This feature requires to use together with mybatis-spring 2.0.2+. |
151+
| `mapper-default-scope` | Default scope for mapper bean that scanned by auto-configure. This feature requires to use together with mybatis-spring 2.0.6+. |
151152
| `configuration.*` | Property keys for `Configuration` bean provided by MyBatis Core. About available nested properties see the [MyBatis reference page](http://www.mybatis.org/mybatis-3/configuration.html#settings). <span class="label important">NOTE</span>: This property cannot be used at the same time with the `config-location`. |
152153
| `scripting-language-driver.thymeleaf.*` | Property keys for `ThymeleafLanguageDriverConfig` bean provided by MyBatis Thymeleaf. About available nested properties see the [MyBatis Thymeleaf reference page](http://www.mybatis.org/thymeleaf-scripting/user-guide.html#_configuration_properties). |
153154
| `scripting-language-driver.freemarker.*` | Properties keys for `FreeMarkerLanguageDriverConfig` bean provided by MyBatis FreeMarker. About available nested properties see the [MyBatis FreeMarker reference page](http://www.mybatis.org/freemarker-scripting/#Configuration). This feature requires to use together with mybatis-freemarker 1.2.0+. |

mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/AdditionalConfigurationMetadataTest.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2015-2019 the original author or authors.
2+
* Copyright 2015-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@ void testProperties() throws IOException {
4444

4545
List<Map<String, Object>> properties = documentContext.read("$.properties");
4646

47-
assertThat(properties.size()).isEqualTo(4);
47+
assertThat(properties.size()).isEqualTo(5);
4848

4949
// assert for mybatis.configuration.default-scripting-language
5050
{
@@ -78,9 +78,17 @@ void testProperties() throws IOException {
7878
assertThat(element.get("type")).isEqualTo("java.lang.Boolean");
7979
}
8080

81-
// assert for mybatis.scripting-language-driver.velocity.userdirective
81+
// assert for mybatis.mapper-default-scope
8282
{
8383
Map<String, Object> element = properties.get(3);
84+
assertThat(element.get("defaultValue")).isEqualTo("");
85+
assertThat(element.get("name")).isEqualTo("mybatis.mapper-default-scope");
86+
assertThat(element.get("type")).isEqualTo("java.lang.String");
87+
}
88+
89+
// assert for mybatis.scripting-language-driver.velocity.userdirective
90+
{
91+
Map<String, Object> element = properties.get(4);
8492
assertThat(element.get("name")).isEqualTo("mybatis.scripting-language-driver.velocity.userdirective");
8593
@SuppressWarnings("unchecked")
8694
Map<String, Object> deprecation = (Map<String, Object>) element.get("deprecation");

mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfigurationTest.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,13 @@
6767
import org.mybatis.spring.mapper.MapperFactoryBean;
6868
import org.mybatis.spring.mapper.MapperScannerConfigurer;
6969
import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
70+
import org.springframework.aop.scope.ScopedProxyFactoryBean;
71+
import org.springframework.beans.BeansException;
7072
import org.springframework.beans.factory.BeanCreationException;
7173
import org.springframework.beans.factory.annotation.Autowired;
74+
import org.springframework.beans.factory.config.BeanDefinition;
75+
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
76+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
7277
import org.springframework.beans.factory.config.PropertiesFactoryBean;
7378
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
7479
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
@@ -78,6 +83,7 @@
7883
import org.springframework.context.annotation.Bean;
7984
import org.springframework.context.annotation.Configuration;
8085
import org.springframework.context.annotation.Primary;
86+
import org.springframework.context.support.SimpleThreadScope;
8187

8288
/**
8389
* Tests for {@link MybatisAutoConfiguration}
@@ -193,6 +199,35 @@ void testAutoScanWithLazy() {
193199
assertThat(sqlSessionFactory.getConfiguration().getMapperRegistry().getMappers()).hasSize(1);
194200
}
195201

202+
@Test
203+
void testAutoScanWithDefaultScope() {
204+
TestPropertyValues.of("mybatis.mapper-default-scope:thread").applyTo(this.context);
205+
this.context.register(EmbeddedDataSourceConfiguration.class, MybatisBootMapperScanAutoConfiguration.class,
206+
MybatisAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class);
207+
this.context.refresh();
208+
{
209+
this.context.getBean(CityMapper.class);
210+
BeanDefinition bd = this.context.getBeanDefinition("cityMapper");
211+
assertThat(bd.getBeanClassName()).isEqualTo(ScopedProxyFactoryBean.class.getName());
212+
BeanDefinition spbd = this.context.getBeanDefinition("scopedTarget.cityMapper");
213+
assertThat(spbd.getBeanClassName()).isEqualTo(MapperFactoryBean.class.getName());
214+
assertThat(spbd.getScope()).isEqualTo("thread");
215+
}
216+
}
217+
218+
@Test
219+
void testAutoScanWithoutDefaultScope() {
220+
this.context.register(EmbeddedDataSourceConfiguration.class, MybatisBootMapperScanAutoConfiguration.class,
221+
MybatisAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class);
222+
this.context.refresh();
223+
{
224+
this.context.getBean(CityMapper.class);
225+
BeanDefinition df = this.context.getBeanDefinition("cityMapper");
226+
assertThat(df.getBeanClassName()).isEqualTo(MapperFactoryBean.class.getName());
227+
assertThat(df.getScope()).isEqualTo("singleton");
228+
}
229+
}
230+
196231
@Test
197232
void testWithConfigLocation() {
198233
TestPropertyValues.of("mybatis.config-location:mybatis-config.xml").applyTo(this.context);
@@ -745,7 +780,11 @@ static MapperScannerConfigurer mapperScannerConfigurer() {
745780

746781
@Configuration
747782
@EnableAutoConfiguration
748-
static class MybatisBootMapperScanAutoConfiguration {
783+
static class MybatisBootMapperScanAutoConfiguration implements BeanFactoryPostProcessor {
784+
@Override
785+
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
786+
beanFactory.registerScope("thread", new SimpleThreadScope());
787+
}
749788
}
750789

751790
@Configuration

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868

6969
<properties>
7070
<mybatis.version>3.5.5</mybatis.version>
71-
<mybatis-spring.version>2.0.5</mybatis-spring.version>
71+
<mybatis-spring.version>2.0.6-SNAPSHOT</mybatis-spring.version>
7272
<mybatis-freemarker.version>1.2.2</mybatis-freemarker.version>
7373
<mybatis-velocity.version>2.1.0</mybatis-velocity.version>
7474
<mybatis-thymeleaf.version>1.0.2</mybatis-thymeleaf.version>

0 commit comments

Comments
 (0)