From 84a749ff661234238acbc403201c0d562027f352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Thu, 8 Aug 2024 22:52:30 +0800 Subject: [PATCH] :bug: Native Support mybatis.config-location --- ...BeanFactoryInitializationAotProcessor.java | 31 +++++++++++++++++++ .../native-image/resource-config.json | 1 - 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MyBatisBeanFactoryInitializationAotProcessor.java b/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MyBatisBeanFactoryInitializationAotProcessor.java index 24c910c4f..825eba37c 100644 --- a/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MyBatisBeanFactoryInitializationAotProcessor.java +++ b/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MyBatisBeanFactoryInitializationAotProcessor.java @@ -27,6 +27,8 @@ import org.apache.ibatis.reflection.TypeParameterResolver; import org.mybatis.spring.mapper.MapperFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.RuntimeHints; import org.springframework.beans.PropertyValue; @@ -36,7 +38,13 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.RegisteredBean; +import org.springframework.core.env.Environment; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.util.ReflectionUtils; +import org.springframework.util.ResourceUtils; +import org.springframework.util.StringUtils; /** * @since 3.0.4 @@ -44,6 +52,12 @@ class MyBatisBeanFactoryInitializationAotProcessor implements BeanFactoryInitializationAotProcessor, BeanRegistrationExcludeFilter { + private static final Logger logger = LoggerFactory.getLogger(MyBatisBeanFactoryInitializationAotProcessor.class); + + private static final ResourceLoader RESOURCE_RESOLVER = new PathMatchingResourcePatternResolver(); + + private static final String CONFIG_LOCATION = MybatisProperties.MYBATIS_PREFIX + ".config-location"; + private static final Set> EXCLUDE_CLASSES = new HashSet<>(); static { @@ -58,6 +72,10 @@ public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableL } return (context, code) -> { RuntimeHints hints = context.getRuntimeHints(); + + Environment environment = beanFactory.getBean(Environment.class); + configLocation(environment, hints); + for (String beanName : beanNames) { BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName.substring(1)); PropertyValue mapperInterface = beanDefinition.getPropertyValues().getPropertyValue("mapperInterface"); @@ -78,6 +96,19 @@ public boolean isExcludedFromAotProcessing(RegisteredBean registeredBean) { return EXCLUDE_CLASSES.contains(registeredBean.getBeanClass()); } + private void configLocation(Environment environment, RuntimeHints hints) { + String configLocation = environment.getRequiredProperty(CONFIG_LOCATION); + + if (StringUtils.hasText(configLocation)) { + Resource resource = RESOURCE_RESOLVER.getResource(configLocation); + if (resource.exists()) { + Stream.of(configLocation.replace(ResourceUtils.CLASSPATH_URL_PREFIX, "")).forEach(hints.resources()::registerPattern); + } else { + logger.error("{}: {} does not exist", CONFIG_LOCATION, configLocation); + } + } + } + private void registerMapperRelationships(Class mapperInterfaceType, RuntimeHints hints) { Method[] methods = ReflectionUtils.getAllDeclaredMethods(mapperInterfaceType); for (Method method : methods) { diff --git a/mybatis-spring-boot-samples/mybatis-spring-boot-sample-graalvm-xml/src/main/resources/META-INF/native-image/resource-config.json b/mybatis-spring-boot-samples/mybatis-spring-boot-sample-graalvm-xml/src/main/resources/META-INF/native-image/resource-config.json index 7e262155c..d50272297 100644 --- a/mybatis-spring-boot-samples/mybatis-spring-boot-sample-graalvm-xml/src/main/resources/META-INF/native-image/resource-config.json +++ b/mybatis-spring-boot-samples/mybatis-spring-boot-sample-graalvm-xml/src/main/resources/META-INF/native-image/resource-config.json @@ -1,7 +1,6 @@ { "resources": { "includes": [ - { "pattern": "mybatis-config.xml" }, { "pattern": "sample/mybatis/graalvm/xml/mapper/CityMapper.xml" }, { "pattern": "sample/mybatis/graalvm/xml/mapper/HotelMapper.xml" } ]