diff --git a/src/main/java/org/mybatis/spring/annotation/MapperScan.java b/src/main/java/org/mybatis/spring/annotation/MapperScan.java index a0dfe7577d..d26d824bb1 100644 --- a/src/main/java/org/mybatis/spring/annotation/MapperScan.java +++ b/src/main/java/org/mybatis/spring/annotation/MapperScan.java @@ -61,7 +61,7 @@ * * @author Michael Lanyon * @author Eduardo Macarron - * + * * @since 1.2.0 * @see MapperScannerRegistrar * @see MapperFactoryBean @@ -101,7 +101,7 @@ * within the Spring container. */ Class extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class; - + /** * This property specifies the annotation that the scanner will search for. *
@@ -136,4 +136,10 @@
*/
String sqlSessionFactoryRef() default "";
+ /**
+ * Specifies a custom MapperFactoryBean to return a mybatis proxy as spring bean.
+ *
+ */
+ Class extends MapperFactoryBean> factoryBean() default MapperFactoryBean.class;
+
}
diff --git a/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java b/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java
index b6814799f3..85375cf02c 100644
--- a/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java
+++ b/src/main/java/org/mybatis/spring/annotation/MapperScannerRegistrar.java
@@ -79,6 +79,11 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
scanner.setBeanNameGenerator(BeanUtils.instantiateClass(generatorClass));
}
+ Class extends MapperFactoryBean> mapperFactoryBeanClass = annoAttrs.getClass("factoryBean");
+ if (!MapperFactoryBean.class.equals(mapperFactoryBeanClass)) {
+ scanner.setMapperFactoryBean(BeanUtils.instantiateClass(mapperFactoryBeanClass));
+ }
+
scanner.setSqlSessionTemplateBeanName(annoAttrs.getString("sqlSessionTemplateRef"));
scanner.setSqlSessionFactoryBeanName(annoAttrs.getString("sqlSessionFactoryRef"));
diff --git a/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java b/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java
index f0ef66b753..089a4ab9ad 100644
--- a/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java
+++ b/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright 2010-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -70,6 +70,8 @@ public class ClassPathMapperScanner extends ClassPathBeanDefinitionScanner {
private Class> markerInterface;
+ private MapperFactoryBean mapperFactoryBean = new MapperFactoryBean();
+
public ClassPathMapperScanner(BeanDefinitionRegistry registry) {
super(registry, false);
}
@@ -102,6 +104,11 @@ public void setSqlSessionFactoryBeanName(String sqlSessionFactoryBeanName) {
this.sqlSessionFactoryBeanName = sqlSessionFactoryBeanName;
}
+ public void setMapperFactoryBean(MapperFactoryBean mapperFactoryBean) {
+ this.mapperFactoryBean = (mapperFactoryBean != null ? mapperFactoryBean : new MapperFactoryBean());
+ }
+
+
/**
* Configures parent scanner to search for the right interfaces. It can search
* for all interfaces or just for those that extends a markerInterface or/and
@@ -177,8 +184,8 @@ private void processBeanDefinitions(Set
- * If it is true, the mapper will be added to MyBatis in the case it is not already
- * registered.
- *
- * By default addToCofig is true.
- *
- * @param addToConfig
- */
- public void setAddToConfig(boolean addToConfig) {
- this.addToConfig = addToConfig;
- }
-
/**
* {@inheritDoc}
*/
@@ -115,7 +91,6 @@ protected void checkDaoConfig() {
/**
* {@inheritDoc}
*/
- @Override
public T getObject() throws Exception {
return getSqlSession().getMapper(this.mapperInterface);
}
@@ -123,7 +98,6 @@ public T getObject() throws Exception {
/**
* {@inheritDoc}
*/
- @Override
public Class
@@ -162,6 +162,22 @@ public void testMarkerInterfaceAndAnnotationScan() {
assertBeanNotLoaded("mapperInterface");
}
+ @Test
+ public void testCustomMapperFactoryBean() {
+ applicationContext.register(AppConfigWithCustomMapperFactoryBean.class);
+
+ startContext();
+
+ // all interfaces with methods should be loaded
+ applicationContext.getBean("mapperInterface");
+ applicationContext.getBean("mapperSubinterface");
+ applicationContext.getBean("mapperChildInterface");
+ applicationContext.getBean("annotatedMapper");
+
+ assertTrue(DummyMapperFactoryBean.getMapperCount() > 0);
+
+ }
+
@Test
public void testScanWithNameConflict() {
GenericBeanDefinition definition = new GenericBeanDefinition();
@@ -265,6 +281,11 @@ public static class AppConfigWithSqlSessionFactory {
public static class AppConfigWithNameGenerator {
}
+ @Configuration
+ @MapperScan(basePackages = "org.mybatis.spring.mapper", factoryBean = DummyMapperFactoryBean.class)
+ public static class AppConfigWithCustomMapperFactoryBean {
+ }
+
public static class BeanNameGenerator implements org.springframework.beans.factory.support.BeanNameGenerator {
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry definitionRegistry) {
diff --git a/src/test/java/org/mybatis/spring/type/DummyMapperFactoryBean.java b/src/test/java/org/mybatis/spring/type/DummyMapperFactoryBean.java
new file mode 100644
index 0000000000..fec9ec1c06
--- /dev/null
+++ b/src/test/java/org/mybatis/spring/type/DummyMapperFactoryBean.java
@@ -0,0 +1,62 @@
+package org.mybatis.spring.type;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.log4j.Logger;
+import org.mybatis.spring.mapper.MapperFactoryBean;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class DummyMapperFactoryBean