feat[graalvm]: orm graalvm support

This commit is contained in:
godotg committed 2023-09-02 18:46:02 +08:00
1 parent 02ae50ea10
commit 9bc3df8537
12 files changed
+146 -33

No files matched your search

@@ -15,12 +15,22 @@ package com.zfoo.boot;
import com.zfoo.orm.OrmContext;
import com.zfoo.orm.accessor.MongodbAccessor;
import com.zfoo.orm.manager.OrmManager;
import com.zfoo.orm.model.anno.GraalvmNativeEntityCache;
import com.zfoo.orm.model.config.OrmConfig;
import com.zfoo.orm.query.MongodbQuery;
import com.zfoo.protocol.util.ClassUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aot.hint.BindingReflectionHintsRegistrar;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportRuntimeHints;
import java.util.HashSet;
/**
* @author godotg
@@ -28,8 +38,11 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(OrmConfig.class)
@ImportRuntimeHints(OrmAutoConfiguration.GraalvmOrmHints.class)
public class OrmAutoConfiguration {
private static final Logger logger = LoggerFactory.getLogger(OrmAutoConfiguration.class);
// OrmConfig in the specific business
// If the OrmConfig bean is not configured in the business, then the Orm automatic assembly here will not take effect.
@Bean
@@ -59,4 +72,39 @@ public class OrmAutoConfiguration {
return new OrmContext();
}
// Register runtime hints for the token library
public static class GraalvmOrmHints implements RuntimeHintsRegistrar {
private final BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
logger.info("orm graalvm aot runtime hints register");
var classes = new HashSet<Class<?>>();
classes.add(OrmConfig.class);
try {
for (var className : ClassUtils.getAllClasses("")) {
try {
var clazz = Class.forName(className);
if (!clazz.isAnnotationPresent(GraalvmNativeEntityCache.class)) {
continue;
}
classes.add(clazz);
classes.addAll(ClassUtils.relevantClass(clazz));
} catch (Throwable t) {
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
for (var clazz : classes) {
this.bindingRegistrar.registerReflectionHints(hints.reflection(), clazz);
logger.info("orm graalvm aot hints register serialization [{}]", clazz);
}
}
}
}
@@ -22,7 +22,9 @@ import com.zfoo.storage.model.resource.ResourceData;
import com.zfoo.storage.model.resource.ResourceEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aot.hint.*;
import org.springframework.aot.hint.BindingReflectionHintsRegistrar;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
@@ -37,7 +39,7 @@ import java.util.HashSet;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(StorageConfig.class)
@ImportRuntimeHints(StorageAutoConfiguration.StorageHints.class)
@ImportRuntimeHints(StorageAutoConfiguration.GraalvmStorageHints.class)
public class StorageAutoConfiguration {
private static final Logger logger = LoggerFactory.getLogger(StorageAutoConfiguration.class);
@@ -59,16 +61,17 @@ public class StorageAutoConfiguration {
// Register runtime hints for the token library
public static class StorageHints implements RuntimeHintsRegistrar {
public static class GraalvmStorageHints implements RuntimeHintsRegistrar {
private final BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
logger.info("storage aot runtime hints register");
logger.info("storage graalvm aot runtime hints register");
var classes = new HashSet<Class<?>>();
classes.add(ResourceData.class);
classes.add(StorageConfig.class);
try {
for (var className : ClassUtils.getAllClasses("")) {
@@ -88,13 +91,13 @@ public class StorageAutoConfiguration {
for (var clazz : classes) {
this.bindingRegistrar.registerReflectionHints(hints.reflection(), clazz);
logger.info("storage aot hints register serialization [{}]", clazz);
logger.info("storage graalvm aot hints register serialization [{}]", clazz);
}
for (var resource : ResourceEnum.values()) {
var include = StringUtils.format("*.{}", resource.getType());
hints.resources().registerPattern(include);
logger.info("storage aot hints register resources [{}]", include);
logger.info("storage graalvm aot hints register resources [{}]", include);
}
}
}