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}