diff --git a/flyfish-approval/pom.xml b/flyfish-approval/pom.xml index a44af21..f806e10 100644 --- a/flyfish-approval/pom.xml +++ b/flyfish-approval/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-backup/pom.xml b/flyfish-backup/pom.xml index 9e5febd..3d74dca 100644 --- a/flyfish-backup/pom.xml +++ b/flyfish-backup/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-common/pom.xml b/flyfish-common/pom.xml index 934eb11..79da011 100644 --- a/flyfish-common/pom.xml +++ b/flyfish-common/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 @@ -65,4 +65,4 @@ - \ No newline at end of file + diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/DynamicJavaCompiler.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/DynamicJavaCompiler.java index ed3d605..80d2bbc 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/compiler/DynamicJavaCompiler.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/DynamicJavaCompiler.java @@ -2,6 +2,7 @@ package com.flyfish.framework.compiler; import com.flyfish.framework.compiler.support.DelegateJavaCompiler; import com.flyfish.framework.compiler.support.SimpleJavaCompiler; +import org.springframework.lang.Nullable; import java.io.Closeable; import java.io.IOException; @@ -37,7 +38,18 @@ public interface DynamicJavaCompiler extends Closeable { * * @param name 文件名 * @param source 源码 + * @return 完整类名 + */ + @Nullable + String compile(String name, String source) throws IOException; + + /** + * 加载类 + * 用于全部编译后,再加载 + * + * @param name 名称 * @return 结果 */ - Class compile(String name, String source) throws ClassNotFoundException, IOException; + @Nullable + Class load(String name); } diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/ClassLoaders.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/ClassLoaders.java index 0a4a86b..7f75fbc 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/ClassLoaders.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/ClassLoaders.java @@ -7,9 +7,9 @@ package com.flyfish.framework.compiler.core; */ public interface ClassLoaders { - MemoryClassLoader CLASS_LOADER = new MemoryClassLoader(); + DynamicClassLoader CLASS_LOADER = new MemoryClassLoader(); - static MemoryClassLoader memory() { + static DynamicClassLoader memory() { return CLASS_LOADER; } } diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/DynamicClassLoader.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/DynamicClassLoader.java new file mode 100644 index 0000000..d60493a --- /dev/null +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/DynamicClassLoader.java @@ -0,0 +1,24 @@ +package com.flyfish.framework.compiler.core; + +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Map; + +/** + * 动态类加载器 + * + * @author wangyu + */ +public abstract class DynamicClassLoader extends URLClassLoader { + + DynamicClassLoader() { + super(new URL[0], DynamicClassLoader.class.getClassLoader()); + } + + /** + * 获取类的字节码 + * + * @return 结果 + */ + public abstract Map getClassBytes(); +} diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/JavaStringCompiler.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/JavaStringCompiler.java index 10bed67..0902d59 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/JavaStringCompiler.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/JavaStringCompiler.java @@ -1,30 +1,31 @@ package com.flyfish.framework.compiler.core; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; + import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; -import java.io.Closeable; import java.io.IOException; import java.util.Collections; -import java.util.Map; /** * In-memory compile Java source code as String. * * @author michael */ -public class JavaStringCompiler implements Closeable { +@Slf4j +class JavaStringCompiler implements VendorJavaCompiler { private final JavaCompiler compiler; private final MemoryJavaFileManager manager; - private final MemoryClassLoader classLoader; - public JavaStringCompiler(MemoryClassLoader classLoader) { + JavaStringCompiler(DynamicClassLoader classLoader) { this.compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager stdManager = compiler.getStandardFileManager(null, null, null); this.manager = new MemoryJavaFileManager(stdManager, classLoader); - this.classLoader = classLoader; } /** @@ -34,27 +35,27 @@ public class JavaStringCompiler implements Closeable { * @param source The source code as String. * @return The compiled results as Map that contains class name as key, * class binary as value. - * @throws IOException If compile error. */ - public Map compile(String fileName, String source) { + @Override + public String compile(String fileName, String source) { JavaFileObject javaFileObject = manager.makeStringSource(fileName, source); JavaCompiler.CompilationTask task = compiler.getTask(null, manager, null, null, null, Collections.singletonList(javaFileObject)); - Boolean result = task.call(); - if (result == null || !result) { - throw new RuntimeException("Compilation failed."); + String className = StringUtils.substringBeforeLast(fileName, "."); + if (BooleanUtils.isTrue(task.call())) { + return manager.getClassBytes().keySet().stream().filter(key -> key.endsWith(className)) + .findFirst().orElse(null); } - return manager.getClassBytes(); + return null; } /** - * Load class from compiled classes. + * 获取动态classLoader * - * @param name Full class name. - * @return The Class instance. - * @throws ClassNotFoundException If class not found. + * @return 结果 */ - public Class loadClass(String name) throws ClassNotFoundException { - return classLoader.loadClass(name); + @Override + public DynamicClassLoader getClassLoader() { + return ClassLoaders.memory(); } @Override @@ -63,11 +64,9 @@ public class JavaStringCompiler implements Closeable { if (null != manager) { manager.close(); } - if (null != classLoader) { - classLoader.close(); - } + getClassLoader().close(); } catch (IOException e) { - e.printStackTrace(); + log.error("关闭类编译器失败!", e); } } } diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryClassLoader.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryClassLoader.java index 19a7708..7fac8e1 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryClassLoader.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryClassLoader.java @@ -2,8 +2,6 @@ package com.flyfish.framework.compiler.core; import org.apache.commons.lang3.StringUtils; -import java.net.URL; -import java.net.URLClassLoader; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -12,15 +10,11 @@ import java.util.concurrent.ConcurrentHashMap; * * @author michael */ -class MemoryClassLoader extends URLClassLoader { +class MemoryClassLoader extends DynamicClassLoader { // class name to class bytes: private final Map classBytes = new ConcurrentHashMap<>(); - public MemoryClassLoader() { - super(new URL[0], MemoryClassLoader.class.getClassLoader()); - } - @Override protected Class findClass(String name) throws ClassNotFoundException { byte[] buf = classBytes.get(name); @@ -31,6 +25,7 @@ class MemoryClassLoader extends URLClassLoader { return defineClass(name, buf); } + @Override public Map getClassBytes() { return classBytes; } diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryJavaFileManager.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryJavaFileManager.java index 269fcb0..254d7e7 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryJavaFileManager.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/MemoryJavaFileManager.java @@ -1,5 +1,7 @@ package com.flyfish.framework.compiler.core; +import lombok.Getter; + import javax.tools.*; import java.io.ByteArrayOutputStream; import java.io.FilterOutputStream; @@ -7,87 +9,82 @@ import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.nio.CharBuffer; -import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; /** * In-memory java file manager. * * @author michael */ +@Getter class MemoryJavaFileManager extends ForwardingJavaFileManager { - // compiled classes in bytes: - private final Map classBytes; + // compiled classes in bytes: + private final Map classBytes; - MemoryJavaFileManager(JavaFileManager fileManager, MemoryClassLoader classLoader) { - super(fileManager); - classBytes = classLoader.getClassBytes(); - } + MemoryJavaFileManager(JavaFileManager fileManager, DynamicClassLoader classLoader) { + super(fileManager); + classBytes = classLoader.getClassBytes(); + } - public Map getClassBytes() { - return this.classBytes; - } + @Override + public void flush() { + } - @Override - public void flush() { - } + @Override + public void close() throws IOException { + classBytes.clear(); + } - @Override - public void close() throws IOException { - classBytes.clear(); - } + @Override + public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind, + FileObject sibling) throws IOException { + if (kind == JavaFileObject.Kind.CLASS) { + return new MemoryOutputJavaFileObject(className); + } else { + return super.getJavaFileForOutput(location, className, kind, sibling); + } + } - @Override - public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind, - FileObject sibling) throws IOException { - if (kind == JavaFileObject.Kind.CLASS) { - return new MemoryOutputJavaFileObject(className); - } else { - return super.getJavaFileForOutput(location, className, kind, sibling); - } - } + JavaFileObject makeStringSource(String name, String code) { + return new MemoryInputJavaFileObject(name, code); + } - JavaFileObject makeStringSource(String name, String code) { - return new MemoryInputJavaFileObject(name, code); - } + static class MemoryInputJavaFileObject extends SimpleJavaFileObject { - static class MemoryInputJavaFileObject extends SimpleJavaFileObject { + final String code; - final String code; + MemoryInputJavaFileObject(String name, String code) { + super(URI.create("string:///" + name), Kind.SOURCE); + this.code = code; + } - MemoryInputJavaFileObject(String name, String code) { - super(URI.create("string:///" + name), Kind.SOURCE); - this.code = code; - } + @Override + public CharBuffer getCharContent(boolean ignoreEncodingErrors) { + return CharBuffer.wrap(code); + } + } - @Override - public CharBuffer getCharContent(boolean ignoreEncodingErrors) { - return CharBuffer.wrap(code); - } - } + class MemoryOutputJavaFileObject extends SimpleJavaFileObject { + final String name; - class MemoryOutputJavaFileObject extends SimpleJavaFileObject { - final String name; + MemoryOutputJavaFileObject(String name) { + super(URI.create("string:///" + name), Kind.CLASS); + this.name = name; + } - MemoryOutputJavaFileObject(String name) { - super(URI.create("string:///" + name), Kind.CLASS); - this.name = name; - } + @Override + public OutputStream openOutputStream() { + return new FilterOutputStream(new ByteArrayOutputStream()) { + @Override + public void close() throws IOException { + out.close(); + ByteArrayOutputStream bos = (ByteArrayOutputStream) out; + classBytes.put(name, bos.toByteArray()); + } + }; + } - @Override - public OutputStream openOutputStream() { - return new FilterOutputStream(new ByteArrayOutputStream()) { - @Override - public void close() throws IOException { - out.close(); - ByteArrayOutputStream bos = (ByteArrayOutputStream) out; - classBytes.put(name, bos.toByteArray()); - } - }; - } - - } + } } diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/VendorJavaCompiler.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/VendorJavaCompiler.java new file mode 100644 index 0000000..6ab0c62 --- /dev/null +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/core/VendorJavaCompiler.java @@ -0,0 +1,31 @@ +package com.flyfish.framework.compiler.core; + +import java.io.Closeable; + +/** + * 第三方java编译器 + * + * @author wangyu + */ +public interface VendorJavaCompiler extends Closeable { + + static VendorJavaCompiler string() { + return new JavaStringCompiler(ClassLoaders.memory()); + } + + /** + * 编译并返回编译结果 + * + * @param name 文件名 + * @param source 源码 + * @return 完整类名 + */ + String compile(String name, String source); + + /** + * 获取动态classLoader + * + * @return 结果 + */ + DynamicClassLoader getClassLoader(); +} diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/DelegateJavaCompiler.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/DelegateJavaCompiler.java index 2708535..40fd687 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/DelegateJavaCompiler.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/DelegateJavaCompiler.java @@ -1,21 +1,21 @@ package com.flyfish.framework.compiler.support; import com.flyfish.framework.compiler.DynamicJavaCompiler; -import com.flyfish.framework.compiler.core.ClassLoaders; -import com.flyfish.framework.compiler.core.JavaStringCompiler; -import org.apache.commons.lang3.StringUtils; +import com.flyfish.framework.compiler.core.VendorJavaCompiler; +import lombok.extern.slf4j.Slf4j; -import java.util.Map; +import java.io.IOException; /** * 使用第三方成熟框架 * * @author wangyu */ +@Slf4j public class DelegateJavaCompiler implements DynamicJavaCompiler { // 第三方编译器 - private final JavaStringCompiler compiler = new JavaStringCompiler(ClassLoaders.memory()); + private final VendorJavaCompiler compiler = VendorJavaCompiler.string(); private DelegateJavaCompiler() { } @@ -29,22 +29,32 @@ public class DelegateJavaCompiler implements DynamicJavaCompiler { * * @param name 文件名 * @param source 源码 + * @return 完整类名 + */ + @Override + public String compile(String name, String source) { + return compiler.compile(name, source); + } + + /** + * 加载类 + * 用于全部编译后,再加载 + * + * @param name 名称 * @return 结果 */ @Override - public Class compile(String name, String source) throws ClassNotFoundException { - Map byteMap = compiler.compile(name, source); - String className = StringUtils.substringBeforeLast(name, "."); - for (String key : byteMap.keySet()) { - if (key.contains(className)) { - return compiler.loadClass(key); - } + public Class load(String name) { + try { + return compiler.getClassLoader().loadClass(name); + } catch (ClassNotFoundException e) { + log.warn("类不存在!{}", name); + return null; } - throw new RuntimeException("【java编译器】源码中没有可以编译的类!"); } @Override - public void close() { + public void close() throws IOException { compiler.close(); } @@ -52,12 +62,4 @@ public class DelegateJavaCompiler implements DynamicJavaCompiler { private static final DelegateJavaCompiler INSTANCE = new DelegateJavaCompiler(); } - - -// public static void main(String[] args) throws ClassNotFoundException, IOException { -// long time = System.currentTimeMillis(); -// System.out.println(StreamUtils.copyToString(DelegateJavaCompiler.class.getResourceAsStream("./"), StandardCharsets.UTF_8)); -// Class clazz = getInstance().compile("Fuck.java", "package com.flyfish.project; public class Fuck {}"); -// System.out.println(clazz + "耗时:" + (System.currentTimeMillis() - time) / 1000.0 + "秒"); -// } } diff --git a/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/SimpleJavaCompiler.java b/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/SimpleJavaCompiler.java index 21c3973..eea5dd3 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/SimpleJavaCompiler.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/compiler/support/SimpleJavaCompiler.java @@ -1,7 +1,8 @@ package com.flyfish.framework.compiler.support; import com.flyfish.framework.compiler.DynamicJavaCompiler; -import org.springframework.util.StreamUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import javax.tools.JavaCompiler; import javax.tools.JavaFileManager; @@ -44,10 +45,10 @@ public class SimpleJavaCompiler implements DynamicJavaCompiler { * @return 结果 */ @Override - public Class compile(String name, String source) throws ClassNotFoundException { + public String compile(String name, String source) { // 存在缓存,写入 if (classMap.containsKey(name)) { - return classMap.get(name); + return classMap.get(name).getName(); } // 构建java文件对象 JavaFileObject fileObject = new StringJavaObject(name, source); @@ -55,12 +56,32 @@ public class SimpleJavaCompiler implements DynamicJavaCompiler { JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, Collections.singletonList(fileObject)); // 阻塞编译 - if (task.call()) { - Class clazz = Class.forName("com.flyfish.project." + name); - classMap.put(name, clazz); - return clazz; + if (BooleanUtils.isTrue(task.call())) { + return "com.flyfish.project." + name; + } + return null; + } + + /** + * 加载类 + * 用于全部编译后,再加载 + * + * @param name 名称 + * @return 结果 + */ + @Override + public Class load(String name) { + String simpleName = StringUtils.substringAfterLast(name, "."); + if (classMap.containsKey(simpleName)) { + return classMap.get(simpleName); + } + try { + Class clazz = Class.forName(name); + classMap.put(clazz.getSimpleName(), clazz); + return clazz; + } catch (ClassNotFoundException e) { + return null; } - throw new RuntimeException("【java编译器】尝试编译源代码出现异常!"); } @Override diff --git a/flyfish-data/pom.xml b/flyfish-data/pom.xml index 139bb91..fc4abcd 100644 --- a/flyfish-data/pom.xml +++ b/flyfish-data/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-dict/pom.xml b/flyfish-dict/pom.xml index f00684a..b4a5947 100644 --- a/flyfish-dict/pom.xml +++ b/flyfish-dict/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-file/pom.xml b/flyfish-file/pom.xml index 3e9a350..ad161c3 100644 --- a/flyfish-file/pom.xml +++ b/flyfish-file/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 @@ -24,4 +24,4 @@ true - \ No newline at end of file + diff --git a/flyfish-form/pom.xml b/flyfish-form/pom.xml index f6fe2f6..724ec7d 100644 --- a/flyfish-form/pom.xml +++ b/flyfish-form/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-logging/pom.xml b/flyfish-logging/pom.xml index e74473e..fcfca11 100644 --- a/flyfish-logging/pom.xml +++ b/flyfish-logging/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-user/pom.xml b/flyfish-user/pom.xml index 9b50bf8..78829bb 100644 --- a/flyfish-user/pom.xml +++ b/flyfish-user/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-web/pom.xml b/flyfish-web/pom.xml index 5702ef0..c1df05a 100644 --- a/flyfish-web/pom.xml +++ b/flyfish-web/pom.xml @@ -5,7 +5,7 @@ flyfish-framework com.flyfish.framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT 4.0.0 diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrarComposite.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrarComposite.java index 2ed7a31..f683b11 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrarComposite.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrarComposite.java @@ -46,6 +46,7 @@ class RepositoryRegistrarComposite implements RepositoryRegistrar { @Override public void register(Class clazz) { + if (null == clazz) return; registrars.forEach(registrar -> registrar.register(clazz)); } } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java b/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java index db90e5a..e669dae 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java @@ -83,11 +83,37 @@ public class RestBeanAutoConfigure implements ImportBeanDefinitionRegistrar, Res // repo注册器 RepositoryRegistrar repositoryRegistrar = RepositoryRegistrar.newInstance(metadata) .init(metadata, resourceLoader, environment, registry, beanNameGenerator); - // 准备注册的repo - Map>> loadedClasses = new ConcurrentHashMap<>(); + // 寻找基本包路径 + String basePackage = basePackages.stream().findFirst().orElse("com.flyfish.project"); // 获取被注解的类,开始编译 Set> classes = reflections.getTypesAnnotatedWith(RestBean.class); - // 并发编译,快速接入 + // 并发编译,快速接入,准备注册的repo + Map> compiledClasses = compile(basePackage, classes); + // 从repo开始,注册bean + compiledClasses.getOrDefault(REPOSITORY, Collections.emptyList()) + .stream() + .map(compiler::load) + .forEach(repositoryRegistrar::register); + compiledClasses.getOrDefault(SERVICE, Collections.emptyList()) + .forEach(clazz -> registerBean(clazz, registry)); + compiledClasses.getOrDefault(CONTROLLER, Collections.emptyList()) + .forEach(clazz -> registerBean(clazz, registry)); + compiledClasses.getOrDefault(VIEW_CONTROLLER, Collections.emptyList()) + .forEach(clazz -> registerBean(clazz, registry)); + compiledClasses.getOrDefault(REACTIVE_VIEW_CONTROLLER, Collections.emptyList()) + .forEach(clazz -> registerBean(clazz, registry)); + log.info("结束注册rest bean..."); + } + + /** + * 解析并编译带注解的rest bean + * + * @param basePackage 基本路径 + * @param classes 类集合 + * @return 结果 + */ + private Map> compile(String basePackage, Set> classes) { + Map> compiled = new ConcurrentHashMap<>(); classes.parallelStream().forEach(clazz -> { RestBean restBean = clazz.getDeclaredAnnotation(RestBean.class); if (null != restBean) { @@ -100,7 +126,7 @@ public class RestBeanAutoConfigure implements ImportBeanDefinitionRegistrar, Res .setBeanClass(clazz.getCanonicalName()) .setQueryBeanClass(restBean.queryClass().getCanonicalName()) .setListViewClass(hasVo ? restBean.listViewClass().getCanonicalName() : null) - .setPackageName(basePackages.stream().findFirst().orElse("com.flyfish.project")) + .setPackageName(basePackage) .setUri(makePath(clazz.getSimpleName(), restBean.value())); // 分别生成实现类,从repo到controller templates.forEach((type, template) -> { @@ -111,37 +137,30 @@ public class RestBeanAutoConfigure implements ImportBeanDefinitionRegistrar, Res source.setSuperClass(superClasses.getOrDefault(type, noOp).apply(restBean).getCanonicalName()); source.setClassName(clazz.getSimpleName() + type.getName()); try { - log.info("尝试注册{}", source.getClassName()); - Class compiled = compiler.compile(source.getClassName() + ".java", template.apply(source)); - loadedClasses.computeIfAbsent(type, k -> new ArrayList<>()).add(compiled); - // IllegalAccessException | InvocationTargetException - } catch (ClassNotFoundException | IOException e) { - log.error("注册{}时发生异常!", source.getClassName(), e); + log.info("尝试编译{}", source.getClassName()); + String className = compiler.compile(source.getClassName() + ".java", template.apply(source)); + Assert.hasText(className, "【java编译器】源码中没有可以编译的类!"); + compiled.computeIfAbsent(type, k -> new ArrayList<>()).add(className); + } catch (IOException e) { + log.error("编译{}时发生异常!", source.getClassName(), e); + } catch (Exception e) { + log.error("编译{}警告!{}", source.getClassName(), e.getMessage()); } }); } }); - // 从repo开始,注册bean - loadedClasses.getOrDefault(REPOSITORY, Collections.emptyList()) - .forEach(repositoryRegistrar::register); - loadedClasses.getOrDefault(SERVICE, Collections.emptyList()) - .forEach(clazz -> registerBean(clazz, registry)); - loadedClasses.getOrDefault(CONTROLLER, Collections.emptyList()) - .forEach(clazz -> registerBean(clazz, registry)); - loadedClasses.getOrDefault(VIEW_CONTROLLER, Collections.emptyList()) - .forEach(clazz -> registerBean(clazz, registry)); - loadedClasses.getOrDefault(REACTIVE_VIEW_CONTROLLER, Collections.emptyList()) - .forEach(clazz -> registerBean(clazz, registry)); - log.info("结束注册rest bean..."); + return compiled; } /** * 注册bean,如果是controller,自动注册controller * - * @param clazz class,要注册的class - * @param registry 注册器,注册bean用 + * @param className class,要注册的class + * @param registry 注册器,注册bean用 */ - private void registerBean(Class clazz, BeanDefinitionRegistry registry) { + private void registerBean(String className, BeanDefinitionRegistry registry) { + Class clazz = compiler.load(className); + Assert.notNull(clazz, "类加载失败:" + className); //生成BeanDefinition并注册到容器中 BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(clazz); BeanDefinition beanDefinition = builder.getRawBeanDefinition(); diff --git a/pom.xml b/pom.xml index 008f99d..135cb67 100644 --- a/pom.xml +++ b/pom.xml @@ -6,13 +6,13 @@ com.flyfish.framework flyfish-framework - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT pom org.springframework.boot spring-boot-starter-parent - 2.7.11 + 2.7.14