فهرست منبع

添加 spring-boot-starter 模块

= 7 سال پیش
والد
کامیت
0544b63770

+ 7 - 1
build.gradle

@@ -7,6 +7,7 @@ ext {
 			mybatisSpringVersion = '1.3.1',
 			mybatisVersion = '3.4.5',
 			springVersion = '4.3.5.RELEASE',
+            springBootVersion = '1.5.9.RELEASE',
 	]
 
 	dependencies = [
@@ -36,7 +37,12 @@ ext {
 			"druid":"com.alibaba:druid:1.0.29",
 			"fastjson":"com.alibaba:fastjson:1.2.37",
 			"tomcatjdbc":"org.apache.tomcat:tomcat-jdbc:9.0.2",
-			"freemarker":"org.freemarker:freemarker:2.3.23"
+			"freemarker":"org.freemarker:freemarker:2.3.23",
+
+            // spring boot
+            "springboot-autoconfigure":"org.springframework.boot:spring-boot-autoconfigure:${springBootVersion}",
+            "springboot-configuration-processor":"org.springframework.boot:spring-boot-configuration-processor:${springBootVersion}",
+            "springboot-starter-jdbc":"org.springframework.boot:spring-boot-starter-jdbc:${springBootVersion}",
 	]
 }
 

+ 8 - 0
mybatis-plus-boot-starter/build.gradle

@@ -0,0 +1,8 @@
+dependencies {
+    compile project(":mybatis-plus-core")
+    compile project(":mybatis-plus-support")
+    optional project(":mybatis-plus-generate")
+    compile rootProject.ext.dependencies["springboot-autoconfigure"]
+    compile rootProject.ext.dependencies["springboot-starter-jdbc"]
+    compileOnly rootProject.ext.dependencies["springboot-configuration-processor"]
+}

+ 20 - 0
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/spring/boot/starter/ConfigurationCustomizer.java

@@ -0,0 +1,20 @@
+package com.baomidou.mybatisplus.spring.boot.starter;
+
+import org.apache.ibatis.session.Configuration;
+
+/**
+ * Callback interface that can be customized a {@link Configuration} object generated on auto-configuration.
+ *
+ * @author Kazuki Shimizu
+ * @since 1.2.1
+ */
+public interface ConfigurationCustomizer {
+
+    /**
+     * Customize the given a {@link Configuration} object.
+     *
+     * @param configuration the configuration object to customize
+     */
+    void customize(Configuration configuration);
+
+}

+ 205 - 0
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/spring/boot/starter/GlobalConfig.java

@@ -0,0 +1,205 @@
+/**
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.baomidou.mybatisplus.spring.boot.starter;
+
+import com.baomidou.mybatisplus.entity.GlobalConfiguration;
+import com.baomidou.mybatisplus.incrementer.IKeyGenerator;
+import com.baomidou.mybatisplus.mapper.ISqlInjector;
+import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
+
+/**
+ * <p>
+ * Mybatis全局缓存
+ * </p>
+ *
+ * @author Caratacus
+ * @since 2017-05-01
+ */
+public class GlobalConfig {
+
+    /**
+     * 主键类型
+     */
+    private Integer idType;
+    /**
+     * 表名、字段名、是否使用下划线命名
+     */
+    private Boolean dbColumnUnderline;
+    /**
+     * SQL注入器
+     */
+    private String sqlInjector;
+    /**
+     * 元对象字段填充控制器
+     */
+    private String metaObjectHandler;
+    /**
+     * 字段验证策略
+     */
+    private Integer fieldStrategy;
+    /**
+     * 方便调试
+     */
+    private Boolean refreshMapper;
+    /**
+     * 是否大写命名
+     */
+    private Boolean isCapitalMode;
+    /**
+     * 标识符
+     */
+    private String identifierQuote;
+    /**
+     * 逻辑删除全局值
+     */
+    private String logicDeleteValue = null;
+    /**
+     * 逻辑未删除全局值
+     */
+    private String logicNotDeleteValue = null;
+    /**
+     * 表关键词 key 生成器
+     */
+    private String keyGenerator;
+
+    public Integer getIdType() {
+        return idType;
+    }
+
+    public void setIdType(Integer idType) {
+        this.idType = idType;
+    }
+
+    public Boolean getDbColumnUnderline() {
+        return dbColumnUnderline;
+    }
+
+    public void setDbColumnUnderline(Boolean dbColumnUnderline) {
+        this.dbColumnUnderline = dbColumnUnderline;
+    }
+
+    public String getSqlInjector() {
+        return sqlInjector;
+    }
+
+    public void setSqlInjector(String sqlInjector) {
+        this.sqlInjector = sqlInjector;
+    }
+
+    public String getMetaObjectHandler() {
+        return metaObjectHandler;
+    }
+
+    public void setMetaObjectHandler(String metaObjectHandler) {
+        this.metaObjectHandler = metaObjectHandler;
+    }
+
+    public Integer getFieldStrategy() {
+        return fieldStrategy;
+    }
+
+    public void setFieldStrategy(Integer fieldStrategy) {
+        this.fieldStrategy = fieldStrategy;
+    }
+
+    public Boolean getCapitalMode() {
+        return isCapitalMode;
+    }
+
+    public void setCapitalMode(Boolean capitalMode) {
+        isCapitalMode = capitalMode;
+    }
+
+    public String getIdentifierQuote() {
+        return identifierQuote;
+    }
+
+    public void setIdentifierQuote(String identifierQuote) {
+        this.identifierQuote = identifierQuote;
+    }
+
+    public Boolean getRefreshMapper() {
+        return refreshMapper;
+    }
+
+    public void setRefreshMapper(Boolean refreshMapper) {
+        this.refreshMapper = refreshMapper;
+    }
+
+    public String getLogicDeleteValue() {
+        return logicDeleteValue;
+    }
+
+    public void setLogicDeleteValue(String logicDeleteValue) {
+        this.logicDeleteValue = logicDeleteValue;
+    }
+
+    public String getLogicNotDeleteValue() {
+        return logicNotDeleteValue;
+    }
+
+    public void setLogicNotDeleteValue(String logicNotDeleteValue) {
+        this.logicNotDeleteValue = logicNotDeleteValue;
+    }
+
+    public String getKeyGenerator() {
+        return keyGenerator;
+    }
+
+    public void setKeyGenerator(String keyGenerator) {
+        this.keyGenerator = keyGenerator;
+    }
+
+    public GlobalConfiguration convertGlobalConfiguration() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+        GlobalConfiguration globalConfiguration = new GlobalConfiguration();
+        if (StringUtils.isNotEmpty(this.getIdentifierQuote())) {
+            globalConfiguration.setIdentifierQuote(this.getIdentifierQuote());
+        }
+        if (StringUtils.isNotEmpty(this.getLogicDeleteValue())) {
+            globalConfiguration.setLogicDeleteValue(this.getLogicDeleteValue());
+        }
+        if (StringUtils.isNotEmpty(this.getLogicNotDeleteValue())) {
+            globalConfiguration.setLogicNotDeleteValue(this.getLogicNotDeleteValue());
+        }
+        if (StringUtils.isNotEmpty(this.getSqlInjector())) {
+            globalConfiguration.setSqlInjector((ISqlInjector) Class.forName(this.getSqlInjector()).newInstance());
+        }
+        if (StringUtils.isNotEmpty(this.getMetaObjectHandler())) {
+            globalConfiguration.setMetaObjectHandler((MetaObjectHandler) Class.forName(this.getMetaObjectHandler()).newInstance());
+        }
+        if (StringUtils.isNotEmpty(this.getKeyGenerator())) {
+            globalConfiguration.setKeyGenerator((IKeyGenerator) Class.forName(this.getKeyGenerator()).newInstance());
+        }
+        if (StringUtils.checkValNotNull(this.getIdType())) {
+            globalConfiguration.setIdType(this.getIdType());
+        }
+        if (StringUtils.checkValNotNull(this.getDbColumnUnderline())) {
+            globalConfiguration.setDbColumnUnderline(this.getDbColumnUnderline());
+        }
+        if (StringUtils.checkValNotNull(this.getFieldStrategy())) {
+            globalConfiguration.setFieldStrategy(this.getFieldStrategy());
+        }
+        if (StringUtils.checkValNotNull(this.getRefreshMapper())) {
+            globalConfiguration.setRefresh(this.getRefreshMapper());
+        }
+        if (StringUtils.checkValNotNull(this.getCapitalMode())) {
+            globalConfiguration.setCapitalMode(this.getCapitalMode());
+        }
+        return globalConfiguration;
+    }
+
+}

+ 232 - 0
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/spring/boot/starter/MybatisPlusAutoConfiguration.java

@@ -0,0 +1,232 @@
+package com.baomidou.mybatisplus.spring.boot.starter;
+
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.mapping.DatabaseIdProvider;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.mapper.ClassPathMapperScanner;
+import org.mybatis.spring.mapper.MapperFactoryBean;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ResourceLoaderAware;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import com.baomidou.mybatisplus.MybatisConfiguration;
+import com.baomidou.mybatisplus.MybatisXMLLanguageDriver;
+import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
+
+/**
+ * {@link EnableAutoConfiguration Auto-Configuration} for Mybatis. Contributes a
+ * {@link SqlSessionFactory} and a {@link SqlSessionTemplate}.
+ * <p>
+ * If {@link org.mybatis.spring.annotation.MapperScan} is used, or a
+ * configuration file is specified as a property, those will be considered,
+ * otherwise this auto-configuration will attempt to register mappers based on
+ * the interface definitions in or under the root auto-configuration package.
+ *
+ * @author Eddú Meléndez
+ * @author Josh Long
+ * @author Kazuki Shimizu
+ * @author Eduardo Macarrón
+ */
+@SuppressWarnings("ConstantConditions")
+@org.springframework.context.annotation.Configuration
+@ConditionalOnClass({SqlSessionFactory.class, MybatisSqlSessionFactoryBean.class})
+@ConditionalOnBean(DataSource.class)
+@EnableConfigurationProperties(MybatisPlusProperties.class)
+@AutoConfigureAfter(DataSourceAutoConfiguration.class)
+public class MybatisPlusAutoConfiguration {
+
+    private static final Log logger = LogFactory.getLog(MybatisPlusAutoConfiguration.class);
+
+    private final MybatisPlusProperties properties;
+
+    private final Interceptor[] interceptors;
+
+    private final ResourceLoader resourceLoader;
+
+    private final DatabaseIdProvider databaseIdProvider;
+
+    private final List<ConfigurationCustomizer> configurationCustomizers;
+
+    public MybatisPlusAutoConfiguration(MybatisPlusProperties properties,
+                                        ObjectProvider<Interceptor[]> interceptorsProvider,
+                                        ResourceLoader resourceLoader,
+                                        ObjectProvider<DatabaseIdProvider> databaseIdProvider,
+                                        ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {
+        this.properties = properties;
+        this.interceptors = interceptorsProvider.getIfAvailable();
+        this.resourceLoader = resourceLoader;
+        this.databaseIdProvider = databaseIdProvider.getIfAvailable();
+        this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable();
+    }
+
+    @PostConstruct
+    public void checkConfigFileExists() {
+        if (this.properties.isCheckConfigLocation() && StringUtils.hasText(this.properties.getConfigLocation())) {
+            Resource resource = this.resourceLoader.getResource(this.properties.getConfigLocation());
+            Assert.state(resource.exists(), "Cannot find config location: " + resource
+                + " (please add config file or check your Mybatis configuration)");
+        }
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
+        MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
+        factory.setDataSource(dataSource);
+        factory.setVfs(SpringBootVFS.class);
+        if (StringUtils.hasText(this.properties.getConfigLocation())) {
+            factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
+        }
+        MybatisConfiguration configuration = this.properties.getConfiguration();
+        if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
+            configuration = new MybatisConfiguration();
+        }
+        if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
+            for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
+                customizer.customize(configuration);
+            }
+        }
+        configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
+        factory.setConfiguration(configuration);
+        if (this.properties.getConfigurationProperties() != null) {
+            factory.setConfigurationProperties(this.properties.getConfigurationProperties());
+        }
+        if (!ObjectUtils.isEmpty(this.interceptors)) {
+            factory.setPlugins(this.interceptors);
+        }
+        if (this.databaseIdProvider != null) {
+            factory.setDatabaseIdProvider(this.databaseIdProvider);
+        }
+        if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
+            factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
+        }
+        // TODO 自定义枚举包
+        if (StringUtils.hasLength(this.properties.getTypeEnumsPackage())) {
+            factory.setTypeEnumsPackage(this.properties.getTypeEnumsPackage());
+        }
+        if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
+            factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
+        }
+        if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
+            factory.setMapperLocations(this.properties.resolveMapperLocations());
+        }
+        if (!ObjectUtils.isEmpty(this.properties.getGlobalConfig())) {
+            factory.setGlobalConfig(this.properties.getGlobalConfig().convertGlobalConfiguration());
+        }
+        return factory.getObject();
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
+        ExecutorType executorType = this.properties.getExecutorType();
+        if (executorType != null) {
+            return new SqlSessionTemplate(sqlSessionFactory, executorType);
+        } else {
+            return new SqlSessionTemplate(sqlSessionFactory);
+        }
+    }
+
+    /**
+     * This will just scan the same base package as Spring Boot does. If you want
+     * more power, you can explicitly use
+     * {@link org.mybatis.spring.annotation.MapperScan} but this will get typed
+     * mappers working correctly, out-of-the-box, similar to using Spring Data JPA
+     * repositories.
+     */
+    public static class AutoConfiguredMapperScannerRegistrar
+        implements BeanFactoryAware, ImportBeanDefinitionRegistrar, ResourceLoaderAware {
+
+        private BeanFactory beanFactory;
+
+        private ResourceLoader resourceLoader;
+
+        @Override
+        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
+
+            logger.debug("Searching for mappers annotated with @Mapper");
+
+            ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
+
+            try {
+                if (this.resourceLoader != null) {
+                    scanner.setResourceLoader(this.resourceLoader);
+                }
+
+                List<String> packages = AutoConfigurationPackages.get(this.beanFactory);
+                if (logger.isDebugEnabled()) {
+                    for (String pkg : packages) {
+                        logger.debug("Using auto-configuration base package '" + pkg + "'");
+                    }
+                }
+
+                scanner.setAnnotationClass(Mapper.class);
+                scanner.registerFilters();
+                scanner.doScan(StringUtils.toStringArray(packages));
+            } catch (IllegalStateException ex) {
+                logger.debug("Could not determine auto-configuration package, automatic mapper scanning disabled." + ex);
+            }
+        }
+
+        @Override
+        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+            this.beanFactory = beanFactory;
+        }
+
+        @Override
+        public void setResourceLoader(ResourceLoader resourceLoader) {
+            this.resourceLoader = resourceLoader;
+        }
+    }
+
+    /**
+     * {@link org.mybatis.spring.annotation.MapperScan} ultimately ends up
+     * creating instances of {@link MapperFactoryBean}. If
+     * {@link org.mybatis.spring.annotation.MapperScan} is used then this
+     * auto-configuration is not needed. If it is _not_ used, however, then this
+     * will bring in a bean registrar and automatically register components based
+     * on the same component-scanning path as Spring Boot itself.
+     */
+    @org.springframework.context.annotation.Configuration
+    @Import({AutoConfiguredMapperScannerRegistrar.class})
+    @ConditionalOnMissingBean(MapperFactoryBean.class)
+    public static class MapperScannerRegistrarNotFoundConfiguration {
+
+        @PostConstruct
+        public void afterPropertiesSet() {
+            logger.debug("No " + MapperFactoryBean.class.getName() + " found.");
+        }
+    }
+
+}

+ 186 - 0
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/spring/boot/starter/MybatisPlusProperties.java

@@ -0,0 +1,186 @@
+package com.baomidou.mybatisplus.spring.boot.starter;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.ibatis.session.ExecutorType;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+
+import com.baomidou.mybatisplus.MybatisConfiguration;
+
+/**
+ * Configuration properties for MyBatis.
+ *
+ * @author Eddú Meléndez
+ * @author Kazuki Shimizu
+ */
+@ConfigurationProperties(prefix = MybatisPlusProperties.MYBATIS_PLUS_PREFIX)
+public class MybatisPlusProperties {
+
+    public static final String MYBATIS_PLUS_PREFIX = "mybatis-plus";
+
+    /**
+     * Location of MyBatis xml config file.
+     */
+    private String configLocation;
+
+    /**
+     * Locations of MyBatis mapper files.
+     */
+    private String[] mapperLocations;
+
+    /**
+     * Packages to search type aliases. (Package delimiters are ",; \t\n")
+     */
+    private String typeAliasesPackage;
+
+    // TODO 自定义枚举包
+    private String typeEnumsPackage;
+
+    /**
+     * Packages to search for type handlers. (Package delimiters are ",; \t\n")
+     */
+    private String typeHandlersPackage;
+
+    /**
+     * Indicates whether perform presence check of the MyBatis xml config file.
+     */
+    private boolean checkConfigLocation = false;
+
+    /**
+     * Execution mode for {@link org.mybatis.spring.SqlSessionTemplate}.
+     */
+    private ExecutorType executorType;
+
+    /**
+     * Externalized properties for MyBatis configuration.
+     */
+    private Properties configurationProperties;
+    /**
+     * Externalized properties for MyBatis configuration.
+     */
+    @NestedConfigurationProperty
+    private GlobalConfig globalConfig;
+
+    /**
+     * A Configuration object for customize default settings. If {@link #configLocation}
+     * is specified, this property is not used.
+     */
+    @NestedConfigurationProperty
+    private MybatisConfiguration configuration;
+
+    /**
+     * @since 1.1.0
+     */
+    public String getConfigLocation() {
+        return this.configLocation;
+    }
+
+    /**
+     * @since 1.1.0
+     */
+    public void setConfigLocation(String configLocation) {
+        this.configLocation = configLocation;
+    }
+
+    public String[] getMapperLocations() {
+        return this.mapperLocations;
+    }
+
+    public void setMapperLocations(String[] mapperLocations) {
+        this.mapperLocations = mapperLocations;
+    }
+
+    public String getTypeHandlersPackage() {
+        return this.typeHandlersPackage;
+    }
+
+    public void setTypeHandlersPackage(String typeHandlersPackage) {
+        this.typeHandlersPackage = typeHandlersPackage;
+    }
+
+    public String getTypeAliasesPackage() {
+        return this.typeAliasesPackage;
+    }
+
+    public void setTypeAliasesPackage(String typeAliasesPackage) {
+        this.typeAliasesPackage = typeAliasesPackage;
+    }
+
+    public String getTypeEnumsPackage() {
+        return typeEnumsPackage;
+    }
+
+    public void setTypeEnumsPackage(String typeEnumsPackage) {
+        this.typeEnumsPackage = typeEnumsPackage;
+    }
+
+    public boolean isCheckConfigLocation() {
+        return this.checkConfigLocation;
+    }
+
+    public void setCheckConfigLocation(boolean checkConfigLocation) {
+        this.checkConfigLocation = checkConfigLocation;
+    }
+
+    public ExecutorType getExecutorType() {
+        return this.executorType;
+    }
+
+    public void setExecutorType(ExecutorType executorType) {
+        this.executorType = executorType;
+    }
+
+    /**
+     * @since 1.2.0
+     */
+    public Properties getConfigurationProperties() {
+        return configurationProperties;
+    }
+
+    /**
+     * @since 1.2.0
+     */
+    public void setConfigurationProperties(Properties configurationProperties) {
+        this.configurationProperties = configurationProperties;
+    }
+
+    public MybatisConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(MybatisConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public Resource[] resolveMapperLocations() {
+        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
+        List<Resource> resources = new ArrayList<Resource>();
+        if (this.mapperLocations != null) {
+            for (String mapperLocation : this.mapperLocations) {
+                try {
+                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
+                    resources.addAll(Arrays.asList(mappers));
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+        }
+        return resources.toArray(new Resource[resources.size()]);
+    }
+
+    public GlobalConfig getGlobalConfig() {
+        return globalConfig;
+    }
+
+    public void setGlobalConfig(GlobalConfig globalConfig) {
+        this.globalConfig = globalConfig;
+    }
+}

+ 48 - 0
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/spring/boot/starter/SpringBootVFS.java

@@ -0,0 +1,48 @@
+package com.baomidou.mybatisplus.spring.boot.starter;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ibatis.io.VFS;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+
+/**
+ * @author Hans Westerbeek
+ * @author Eddú Meléndez
+ * @author Kazuki Shimizu
+ */
+public class SpringBootVFS extends VFS {
+
+    private final ResourcePatternResolver resourceResolver;
+
+    public SpringBootVFS() {
+        this.resourceResolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader());
+    }
+
+    private static String preserveSubpackageName(final URI uri, final String rootPath) {
+        final String uriStr = uri.toString();
+        final int start = uriStr.indexOf(rootPath);
+        return uriStr.substring(start);
+    }
+
+    @Override
+    public boolean isValid() {
+        return true;
+    }
+
+    @Override
+    protected List<String> list(URL url, String path) throws IOException {
+        Resource[] resources = resourceResolver.getResources("classpath*:" + path + "/**/*.class");
+        List<String> resourcePaths = new ArrayList<String>();
+        for (Resource resource : resources) {
+            resourcePaths.add(preserveSubpackageName(resource.getURI(), path));
+        }
+        return resourcePaths;
+    }
+
+}

+ 4 - 0
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/spring/boot/starter/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * @author Eddú Meléndez
+ */
+package com.baomidou.mybatisplus.spring.boot.starter;

+ 120 - 0
mybatis-plus-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json

@@ -0,0 +1,120 @@
+{
+  "hints": [{
+    "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+    "name": "mybatis-plus.global-config.id-type",
+    "type": "java.lang.Integer",
+    "description": "主键类型",
+    "values": [
+      {
+        "value": "0",
+        "description": "数据库ID自增"
+      }, {
+        "value": "1",
+        "description": "用户输入ID"
+      }, {
+        "value": "2",
+        "description": "分布式全局唯一ID"
+      }, {
+        "value": "3",
+        "description": "全局唯一ID-UUID"
+      }
+    ]
+  },{
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.field-strategy",
+      "type": "java.lang.Integer",
+      "description": "字段验证策略",
+      "values": [
+        {
+          "value": "0",
+          "description": "忽略判断"
+        }, {
+          "value": "1",
+          "description": "非 NULL 判断"
+        }, {
+          "value": "2",
+          "description": "非空判断"
+        }
+    ]
+  }],
+  "groups": [
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties",
+      "name": "mybatis-plus",
+      "type": "com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties",
+      "name": "mybatis-plus.configuration",
+      "sourceMethod": "getConfiguration()",
+      "type": "com.baomidou.mybatisplus.MybatisConfiguration"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties",
+      "name": "mybatis-plus.global-config",
+      "sourceMethod": "getGlobalConfig()",
+      "type": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig"
+    }
+  ],
+  "properties": [
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.capital-mode",
+      "type": "java.lang.Boolean",
+      "description": "是否大写命名"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.db-column-underline",
+      "type": "java.lang.Boolean",
+      "description": "是否使用下划线命名"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.identifier-quote",
+      "type": "java.lang.String",
+      "description": "标识符"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.key-generator",
+      "type": "java.lang.String",
+      "description": "表关键词key生成器"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.logic-delete-value",
+      "type": "java.lang.String",
+      "description": "逻辑删除全局值"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.logic-not-delete-value",
+      "type": "java.lang.String",
+      "description": "逻辑未删除全局值"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.meta-object-handler",
+      "type": "java.lang.String",
+      "description": "元对象字段填充控制器"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.refresh-mapper",
+      "type": "java.lang.Boolean",
+      "description": "是否动态刷新mapper"
+    },
+    {
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig",
+      "name": "mybatis-plus.global-config.sql-injector",
+      "type": "java.lang.String",
+      "description": "SQL注入器"
+    },{
+      "sourceType": "com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties",
+      "name": "mybatis-plus.type-enums-package",
+      "type": "java.lang.String",
+      "description": "自定义枚举包"
+    }
+  ]
+}

+ 1 - 0
mybatis-plus-boot-starter/src/main/resources/META-INF/spring-devtools.properties

@@ -0,0 +1 @@
+restart.include.mybatis-plus=/mybatis-plus-[\\w-]+\.jar

+ 3 - 0
mybatis-plus-boot-starter/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,3 @@
+# Auto Configure
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusAutoConfiguration

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/MybatisConfiguration.java

@@ -39,7 +39,7 @@ public class MybatisConfiguration extends Configuration {
 
     private static final Log logger = LogFactory.getLog(MybatisConfiguration.class);
 
-    /*
+    /**
      * Mapper 注册
      */
     public final MybatisMapperRegistry mybatisMapperRegistry = new MybatisMapperRegistry(this);

+ 1 - 0
settings.gradle

@@ -3,4 +3,5 @@ include 'mybatis-plus'
 include 'mybatis-plus-support'
 include 'mybatis-plus-core'
 include 'mybatis-plus-generate'
+include 'mybatis-plus-boot-starter'