From ef802bb1ce344bf804c16118e7ffcdc03f24a2f0 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 12 Jan 2024 14:34:18 +0800 Subject: [PATCH] EntityBuilder --- src/main/java/org/redkale/annotation/Priority.java | 10 ++++++++++ src/main/java/org/redkale/net/Filter.java | 2 +- src/main/java/org/redkale/source/DataSqlSource.java | 12 ++++-------- src/main/java/org/redkale/source/EntityBuilder.java | 11 +++++++++-- .../org/redkale/source/spi/DataSqlMapperBuilder.java | 8 ++++++-- .../org/redkale/source/spi/SourceModuleEngine.java | 6 ++++++ 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/redkale/annotation/Priority.java b/src/main/java/org/redkale/annotation/Priority.java index 823bca725..207bb2a6e 100644 --- a/src/main/java/org/redkale/annotation/Priority.java +++ b/src/main/java/org/redkale/annotation/Priority.java @@ -30,6 +30,16 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Priority { + /** + * 最高优先级, 其他值必须比此值小 + */ + public static final int HIGHTEST = Integer.MAX_VALUE; + + /** + * 最低优先级, 其他值必须比此值大 + */ + public static final int LOWEST = Integer.MIN_VALUE; + /** * 优先级值 * diff --git a/src/main/java/org/redkale/net/Filter.java b/src/main/java/org/redkale/net/Filter.java index 463678eab..59ff2283a 100644 --- a/src/main/java/org/redkale/net/Filter.java +++ b/src/main/java/org/redkale/net/Filter.java @@ -11,7 +11,7 @@ import org.redkale.util.AnyValue; /** * 协议拦截器类, 类似JavaEE中的javax.servlet.Filter
- * javax.servlet.Filter方法doFilter是同步操作,此Filter.doFilter则是异步操作,方法return前需要调用Response.nextEvent()方可执行下一个Filter
+ * javax.servlet.Filter方法doFilter是同步操作,此Filter.doFilter则是异步操作,方法return前必须调用Response.nextEvent()
* 通过给Filter标记注解@Priority来确定执行的顺序, Priority.value值越大越先执行
* 如果doFilter方法是非阻塞的,需要在Filter类上标记@NonBlocking * diff --git a/src/main/java/org/redkale/source/DataSqlSource.java b/src/main/java/org/redkale/source/DataSqlSource.java index 5a79a60f8..5c8e237ba 100644 --- a/src/main/java/org/redkale/source/DataSqlSource.java +++ b/src/main/java/org/redkale/source/DataSqlSource.java @@ -232,8 +232,7 @@ public interface DataSqlSource extends DataSource { if (!rset.next()) { return null; } - if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type) - || (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) { + if (EntityBuilder.isSimpleType(type)) { return (V) formatColumnValue(type, rset.getObject(1)); } return EntityBuilder.load(type).getObjectValue(rset); @@ -246,8 +245,7 @@ public interface DataSqlSource extends DataSource { if (!rset.next()) { return null; } - if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type) - || (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) { + if (EntityBuilder.isSimpleType(type)) { return (V) formatColumnValue(type, rset.getObject(1)); } return EntityBuilder.load(type).getObjectValue(rset); @@ -257,8 +255,7 @@ public interface DataSqlSource extends DataSource { @AsmDepends default List nativeQueryList(Class type, String sql, Map params) { return nativeQuery(sql, rset -> { - if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type) - || (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) { + if (EntityBuilder.isSimpleType(type)) { List list = new ArrayList<>(); while (rset.next()) { list.add(rset.wasNull() ? null : (V) formatColumnValue(type, rset.getObject(1))); @@ -272,8 +269,7 @@ public interface DataSqlSource extends DataSource { @AsmDepends default CompletableFuture> nativeQueryListAsync(Class type, String sql, Map params) { return nativeQueryAsync(sql, rset -> { - if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type) - || (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) { + if (EntityBuilder.isSimpleType(type)) { List list = new ArrayList<>(); while (rset.next()) { list.add(rset.wasNull() ? null : (V) formatColumnValue(type, rset.getObject(1))); diff --git a/src/main/java/org/redkale/source/EntityBuilder.java b/src/main/java/org/redkale/source/EntityBuilder.java index 66923743a..bf26be7a2 100644 --- a/src/main/java/org/redkale/source/EntityBuilder.java +++ b/src/main/java/org/redkale/source/EntityBuilder.java @@ -17,6 +17,8 @@ import org.redkale.util.*; * 可以是实体类,也可以是查询结果的JavaBean类 * * @author zhangjx + * @param T + * * @since 2.8.0 */ public class EntityBuilder { @@ -54,7 +56,7 @@ public class EntityBuilder { private final Attribute[] unconstructorAttributes; //key:类字段名 - private final Map> attributeMap; + final Map> attributeMap; //key:数据库字段名 private final Map> sqlAttrMap; @@ -81,8 +83,13 @@ public class EntityBuilder { attributeMap.forEach((k, v) -> sqlAttrMap.put(getSQLColumn(null, k), v)); } + public static boolean isSimpleType(Class type) { + return type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type) + || (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java.")); + } + public static EntityBuilder load(Class type) { - return cacheMap.computeIfAbsent(type, t -> create(t)); + return cacheMap.computeIfAbsent(type, EntityBuilder::create); } private static EntityBuilder create(Class type) { diff --git a/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java b/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java index 7de43885b..e4e7412a7 100644 --- a/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java +++ b/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java @@ -33,6 +33,7 @@ import static org.redkale.source.DataNativeSqlInfo.SqlMode.SELECT; import org.redkale.source.DataNativeSqlParser; import org.redkale.source.DataSqlMapper; import org.redkale.source.DataSqlSource; +import org.redkale.source.EntityBuilder; import org.redkale.source.Flipper; import org.redkale.source.SourceException; import org.redkale.util.RedkaleClassLoader; @@ -84,7 +85,7 @@ public final class DataSqlMapperBuilder { } catch (Throwable t) { t.printStackTrace(); } - + EntityBuilder.load(entityType); List items = new ArrayList<>(); Map selfMethodBeans = AsmMethodBoost.getMethodBeans(mapperType); for (Method method : mapperType.getMethods()) { @@ -221,7 +222,10 @@ public final class DataSqlMapperBuilder { Class[] paramTypes = method.getParameterTypes(); List methodParams = methodBean.getParams(); List insns = new ArrayList<>(); - + if (!EntityBuilder.isSimpleType(componentTypes[0])) { + EntityBuilder.load(componentTypes[0]); + } + mv = new MethodDebugVisitor(cw.visitMethod(ACC_PUBLIC, method.getName(), methodBean.getDesc(), methodBean.getSignature(), null)).setDebug(false); Label l0 = new Label(); mv.visitLabel(l0); diff --git a/src/main/java/org/redkale/source/spi/SourceModuleEngine.java b/src/main/java/org/redkale/source/spi/SourceModuleEngine.java index c65a38a61..cc7739dfd 100644 --- a/src/main/java/org/redkale/source/spi/SourceModuleEngine.java +++ b/src/main/java/org/redkale/source/spi/SourceModuleEngine.java @@ -146,6 +146,7 @@ public class SourceModuleEngine extends ModuleEngine implements SourceManager { * @param namespace 命名空间 * @param events 变更项 */ + @Override public void onEnvironmentChanged(String namespace, List events) { Set sourceRemovedKeys = new HashSet<>(); Properties sourceChangedProps = new Properties(); @@ -307,6 +308,7 @@ public class SourceModuleEngine extends ModuleEngine implements SourceManager { /** * 服务全部停掉后被调用 */ + @Override public void onServersPostStop() { for (DataSource source : dataSources) { if (source == null) { @@ -343,12 +345,14 @@ public class SourceModuleEngine extends ModuleEngine implements SourceManager { * * @return CacheSource集合 */ + @Override public Map getCacheSources() { Map sources = new HashMap<>(); cacheSources.forEach(v -> sources.put(v.resourceName(), v)); return sources; } + @Override public CacheSource loadCacheSource(final String sourceName, boolean autoMemory) { cacheSourceLock.lock(); try { @@ -402,12 +406,14 @@ public class SourceModuleEngine extends ModuleEngine implements SourceManager { * * @return DataSource集合 */ + @Override public Map getDataSources() { Map sources = new HashMap<>(); dataSources.forEach(v -> sources.put(v.resourceName(), v)); return sources; } + @Override public DataSource loadDataSource(final String sourceName, boolean autoMemory) { dataSourceLock.lock(); try {