001/*
002 *    Copyright 2015-2022 the original author or authors.
003 *
004 *    Licensed under the Apache License, Version 2.0 (the "License");
005 *    you may not use this file except in compliance with the License.
006 *    You may obtain a copy of the License at
007 *
008 *       https://www.apache.org/licenses/LICENSE-2.0
009 *
010 *    Unless required by applicable law or agreed to in writing, software
011 *    distributed under the License is distributed on an "AS IS" BASIS,
012 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *    See the License for the specific language governing permissions and
014 *    limitations under the License.
015 */
016package com.mybatisflex.spring.boot;
017
018import org.apache.ibatis.scripting.LanguageDriver;
019import org.mybatis.scripting.freemarker.FreeMarkerLanguageDriver;
020import org.mybatis.scripting.freemarker.FreeMarkerLanguageDriverConfig;
021import org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriver;
022import org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriverConfig;
023import org.mybatis.scripting.velocity.VelocityLanguageDriver;
024import org.mybatis.scripting.velocity.VelocityLanguageDriverConfig;
025import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
026import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
027import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
028import org.springframework.boot.context.properties.ConfigurationProperties;
029import org.springframework.context.annotation.Bean;
030import org.springframework.context.annotation.Configuration;
031
032/**
033 * 脚本语言驱动的自动配置,平常一般项目用不到,只为了同步 MyBatis 自带的 MybatisLanguageDriverAutoConfiguration。
034 * 参考:https://github.com/mybatis/spring-boot-starter/blob/master/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MybatisLanguageDriverAutoConfiguration.java
035 * @author Kazuki Shimizu
036 * @author michael
037 */
038@Configuration(proxyBeanMethods = false)
039@ConditionalOnClass(LanguageDriver.class)
040public class MybatisLanguageDriverAutoConfiguration {
041
042    private static final String CONFIGURATION_PROPERTY_PREFIX = "mybatis-flex.scripting-language-driver";
043
044    /**
045     * Configuration class for mybatis-freemarker 1.1.x or under.
046     */
047    @Configuration(proxyBeanMethods = false)
048    @ConditionalOnClass(FreeMarkerLanguageDriver.class)
049    @ConditionalOnMissingClass("org.mybatis.scripting.freemarker.FreeMarkerLanguageDriverConfig")
050    public static class LegacyFreeMarkerConfiguration {
051
052        @Bean
053        @ConditionalOnMissingBean
054        FreeMarkerLanguageDriver freeMarkerLanguageDriver() {
055            return new FreeMarkerLanguageDriver();
056        }
057
058    }
059
060    /**
061     * Configuration class for mybatis-freemarker 1.2.x or above.
062     */
063    @Configuration(proxyBeanMethods = false)
064    @ConditionalOnClass({FreeMarkerLanguageDriver.class, FreeMarkerLanguageDriverConfig.class})
065    public static class FreeMarkerConfiguration {
066
067        @Bean
068        @ConditionalOnMissingBean
069        FreeMarkerLanguageDriver freeMarkerLanguageDriver(FreeMarkerLanguageDriverConfig config) {
070            return new FreeMarkerLanguageDriver(config);
071        }
072
073        @Bean
074        @ConditionalOnMissingBean
075        @ConfigurationProperties(CONFIGURATION_PROPERTY_PREFIX + ".freemarker")
076        public FreeMarkerLanguageDriverConfig freeMarkerLanguageDriverConfig() {
077            return FreeMarkerLanguageDriverConfig.newInstance();
078        }
079
080    }
081
082    /**
083     * Configuration class for mybatis-velocity 2.0 or under.
084     */
085    @Configuration(proxyBeanMethods = false)
086    @ConditionalOnClass(org.mybatis.scripting.velocity.Driver.class)
087    @ConditionalOnMissingClass("org.mybatis.scripting.velocity.VelocityLanguageDriverConfig")
088    @SuppressWarnings("deprecation")
089    public static class LegacyVelocityConfiguration {
090
091        @Bean
092        @ConditionalOnMissingBean
093        org.mybatis.scripting.velocity.Driver velocityLanguageDriver() {
094            return new org.mybatis.scripting.velocity.Driver();
095        }
096
097    }
098
099    /**
100     * Configuration class for mybatis-velocity 2.1.x or above.
101     */
102    @Configuration(proxyBeanMethods = false)
103    @ConditionalOnClass({VelocityLanguageDriver.class, VelocityLanguageDriverConfig.class})
104    public static class VelocityConfiguration {
105
106        @Bean
107        @ConditionalOnMissingBean
108        VelocityLanguageDriver velocityLanguageDriver(VelocityLanguageDriverConfig config) {
109            return new VelocityLanguageDriver(config);
110        }
111
112        @Bean
113        @ConditionalOnMissingBean
114        @ConfigurationProperties(CONFIGURATION_PROPERTY_PREFIX + ".velocity")
115        public VelocityLanguageDriverConfig velocityLanguageDriverConfig() {
116            return VelocityLanguageDriverConfig.newInstance();
117        }
118
119    }
120
121    @Configuration(proxyBeanMethods = false)
122    @ConditionalOnClass(ThymeleafLanguageDriver.class)
123    public static class ThymeleafConfiguration {
124
125        @Bean
126        @ConditionalOnMissingBean
127        ThymeleafLanguageDriver thymeleafLanguageDriver(ThymeleafLanguageDriverConfig config) {
128            return new ThymeleafLanguageDriver(config);
129        }
130
131        @Bean
132        @ConditionalOnMissingBean
133        @ConfigurationProperties(CONFIGURATION_PROPERTY_PREFIX + ".thymeleaf")
134        public ThymeleafLanguageDriverConfig thymeleafLanguageDriverConfig() {
135            return ThymeleafLanguageDriverConfig.newInstance();
136        }
137
138        // This class provides to avoid the https://github.com/spring-projects/spring-boot/issues/21626 as workaround.
139        @SuppressWarnings("unused")
140        private static class MetadataThymeleafLanguageDriverConfig extends ThymeleafLanguageDriverConfig {
141
142            @ConfigurationProperties(CONFIGURATION_PROPERTY_PREFIX + ".thymeleaf.dialect")
143            @Override
144            public DialectConfig getDialect() {
145                return super.getDialect();
146            }
147
148            @ConfigurationProperties(CONFIGURATION_PROPERTY_PREFIX + ".thymeleaf.template-file")
149            @Override
150            public TemplateFileConfig getTemplateFile() {
151                return super.getTemplateFile();
152            }
153
154        }
155
156    }
157
158}