diff --git a/src/main/java/org/redkale/asm/AsmMethodBoost.java b/src/main/java/org/redkale/asm/AsmMethodBoost.java index b98d1eca6..ebc49d2e7 100644 --- a/src/main/java/org/redkale/asm/AsmMethodBoost.java +++ b/src/main/java/org/redkale/asm/AsmMethodBoost.java @@ -4,6 +4,7 @@ package org.redkale.asm; import java.lang.reflect.Method; +import java.util.Collection; import org.redkale.annotation.Nullable; /** @@ -15,6 +16,14 @@ import org.redkale.annotation.Nullable; */ public interface AsmMethodBoost { + public static AsmMethodBoost create(Collection list) { + return new AsmMethodBoosts(list); + } + + public static AsmMethodBoost create(AsmMethodBoost... items) { + return new AsmMethodBoosts(items); + } + /** * 对方法进行动态加强处理 * diff --git a/src/main/java/org/redkale/asm/AsmMethodBoosts.java b/src/main/java/org/redkale/asm/AsmMethodBoosts.java index 76fb8c9df..cb55eb6b6 100644 --- a/src/main/java/org/redkale/asm/AsmMethodBoosts.java +++ b/src/main/java/org/redkale/asm/AsmMethodBoosts.java @@ -4,6 +4,7 @@ package org.redkale.asm; import java.lang.reflect.Method; +import java.util.Collection; /** * 生产动态字节码的方法扩展器, 可以进行方法加强动作 @@ -12,18 +13,22 @@ import java.lang.reflect.Method; * * @since 2.8.0 */ -public class AsmMethodBoosts implements AsmMethodBoost { +class AsmMethodBoosts implements AsmMethodBoost { - private final AsmMethodBoosts[] items; + private final AsmMethodBoost[] items; - public AsmMethodBoosts(AsmMethodBoosts... items) { + public AsmMethodBoosts(Collection list) { + this.items = list.toArray(new AsmMethodBoost[list.size()]); + } + + public AsmMethodBoosts(AsmMethodBoost... items) { this.items = items; } @Override public String doMethod(ClassWriter cw, Method method, String newMethodName) { String newName = newMethodName; - for (AsmMethodBoosts item : items) { + for (AsmMethodBoost item : items) { if (item != null) { newName = item.doMethod(cw, method, newName); } @@ -33,7 +38,7 @@ public class AsmMethodBoosts implements AsmMethodBoost { @Override public void doInstance(T service) { - for (AsmMethodBoosts item : items) { + for (AsmMethodBoost item : items) { if (item != null) { item.doInstance(service); } diff --git a/src/main/java/org/redkale/boot/Application.java b/src/main/java/org/redkale/boot/Application.java index d335dd454..47604c7f6 100644 --- a/src/main/java/org/redkale/boot/Application.java +++ b/src/main/java/org/redkale/boot/Application.java @@ -21,6 +21,7 @@ import java.util.function.Consumer; import java.util.logging.*; import org.redkale.annotation.Nonnull; import org.redkale.annotation.Resource; +import org.redkale.asm.AsmMethodBoost; import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.cache.spi.CacheModuleEngine; import org.redkale.cluster.*; @@ -841,6 +842,23 @@ public final class Application { } } + AsmMethodBoost createAsmMethodBoost(Class serviceClass) { + List list = null; + for (ModuleEngine item : moduleEngines) { + AsmMethodBoost boost = item.createAsmMethodBoost(serviceClass); + if (boost != null) { + if (list == null) { + list = new ArrayList<>(); + } + list.add(boost); + } + } + if (list == null) { + return null; + } + return list.size() == 1 ? list.get(0) : AsmMethodBoost.create(list); + } + /** * 进入Application.init方法时被调用 */ diff --git a/src/main/java/org/redkale/boot/ModuleEngine.java b/src/main/java/org/redkale/boot/ModuleEngine.java index 3f34d25a4..9df31fb5d 100644 --- a/src/main/java/org/redkale/boot/ModuleEngine.java +++ b/src/main/java/org/redkale/boot/ModuleEngine.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Objects; import java.util.Properties; import java.util.logging.Logger; +import org.redkale.asm.AsmMethodBoost; import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceFactory; import org.redkale.service.Service; @@ -54,6 +55,17 @@ public abstract class ModuleEngine { return null; } + /** + * 动态扩展类的方法 + * + * @param serviceClass 类 + * + * @return 方法动态扩展器 + */ + public AsmMethodBoost createAsmMethodBoost(Class serviceClass) { + return null; + } + /** * 进入Application.init方法时被调用 * 此时状态: diff --git a/src/main/java/org/redkale/boot/NodeHttpServer.java b/src/main/java/org/redkale/boot/NodeHttpServer.java index 46304c55d..cdd355cee 100644 --- a/src/main/java/org/redkale/boot/NodeHttpServer.java +++ b/src/main/java/org/redkale/boot/NodeHttpServer.java @@ -14,6 +14,7 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.stream.Stream; import org.redkale.annotation.*; +import org.redkale.asm.AsmMethodBoost; import static org.redkale.boot.Application.RESNAME_SNCP_ADDRESS; import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.cluster.ClusterAgent; @@ -170,7 +171,9 @@ public class NodeHttpServer extends NodeServer { } catch (Exception ex) { logger.log(Level.WARNING, "WebSocketServlet getMessageAgent error", ex); } - nodeService = Sncp.createLocalService(serverClassLoader, resourceName, org.redkale.net.http.WebSocketNodeService.class, application.getResourceFactory(), application.getSncpRpcGroups(), sncpClient, messageAgent, (String) null, (AnyValue) null); + AsmMethodBoost methodBoost = application.createAsmMethodBoost(WebSocketNodeService.class); + nodeService = Sncp.createLocalService(serverClassLoader, resourceName, WebSocketNodeService.class, methodBoost, + application.getResourceFactory(), application.getSncpRpcGroups(), sncpClient, messageAgent, (String) null, (AnyValue) null); regFactory.register(resourceName, WebSocketNode.class, nodeService); } resourceFactory.inject(resourceName, nodeService, self); diff --git a/src/main/java/org/redkale/boot/NodeServer.java b/src/main/java/org/redkale/boot/NodeServer.java index 9ed1506d7..285cf4b2a 100644 --- a/src/main/java/org/redkale/boot/NodeServer.java +++ b/src/main/java/org/redkale/boot/NodeServer.java @@ -18,6 +18,7 @@ import java.util.logging.*; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; import org.redkale.annotation.Command; +import org.redkale.asm.AsmMethodBoost; import static org.redkale.boot.Application.*; import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.cluster.ClusterAgent; @@ -28,6 +29,7 @@ import org.redkale.net.*; import org.redkale.net.Filter; import org.redkale.net.client.ClientAddress; import org.redkale.net.http.*; +import org.redkale.net.http.WebSocketNodeService; import org.redkale.net.sncp.*; import org.redkale.service.*; import org.redkale.source.*; @@ -262,7 +264,8 @@ public abstract class NodeServer { if (groups.isEmpty() && isSNCP() && NodeServer.this.sncpGroup != null) { groups.add(NodeServer.this.sncpGroup); } - nodeService = Sncp.createLocalService(serverClassLoader, resourceName, org.redkale.net.http.WebSocketNodeService.class, + AsmMethodBoost methodBoost = application.createAsmMethodBoost(WebSocketNodeService.class); + nodeService = Sncp.createLocalService(serverClassLoader, resourceName, WebSocketNodeService.class, methodBoost, application.getResourceFactory(), application.getSncpRpcGroups(), sncpClient, null, (String) null, (AnyValue) null); (isSNCP() ? appResFactory : resourceFactory).register(resourceName, WebSocketNode.class, nodeService); ((org.redkale.net.http.WebSocketNodeService) nodeService).setName(resourceName); @@ -324,10 +327,14 @@ public abstract class NodeServer { } //ResourceFactory resfactory = (isSNCP() ? appResFactory : resourceFactory); - Service service = Modifier.isFinal(resServiceType.getModifiers()) || Sncp.isComponent(resServiceType) - ? (Service) resServiceType.getConstructor().newInstance() - : Sncp.createLocalService(serverClassLoader, resourceName, resServiceType, - appResFactory, application.getSncpRpcGroups(), sncpClient, null, null, null); + Service service; + if (Modifier.isFinal(resServiceType.getModifiers()) || Sncp.isComponent(resServiceType)) { + service = (Service) resServiceType.getConstructor().newInstance(); + } else { + AsmMethodBoost methodBoost = application.createAsmMethodBoost(resServiceType); + service = Sncp.createLocalService(serverClassLoader, resourceName, resServiceType, + methodBoost, appResFactory, application.getSncpRpcGroups(), sncpClient, null, null, null); + } appResFactory.register(resourceName, resServiceType, service); field.set(srcObj, service); @@ -415,10 +422,14 @@ public abstract class NodeServer { return null; } service = serviceImplClass.getDeclaredConstructor().newInstance(); - } else if (ws || localMode) { //本地模式 - service = Sncp.createLocalService(serverClassLoader, resourceName, serviceImplClass, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty()); + } else if (ws || localMode) { //本地模式 + AsmMethodBoost methodBoost = application.createAsmMethodBoost(serviceImplClass); + service = Sncp.createLocalService(serverClassLoader, resourceName, serviceImplClass, + methodBoost, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty()); } else { - service = Sncp.createRemoteService(serverClassLoader, resourceName, serviceImplClass, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty()); + AsmMethodBoost methodBoost = application.createAsmMethodBoost(serviceImplClass); + service = Sncp.createRemoteService(serverClassLoader, resourceName, serviceImplClass, + methodBoost, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty()); } final Class restype = Sncp.getResourceType(service); if (rf.find(resourceName, restype) == null) { diff --git a/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java b/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java index f1fa91693..4535602fe 100644 --- a/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java +++ b/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java @@ -56,7 +56,7 @@ public class CacheModuleEngine extends ModuleEngine { //设置缓存管理器 this.config = application.getAppConfig().getAnyValue("cache"); this.cacheManager = createManager(this.config); - if (this.config != null && !application.isCompileMode()) { + if (!application.isCompileMode()) { this.resourceFactory.inject(this.cacheManager); if (this.cacheManager instanceof Service) { ((Service) this.cacheManager).init(this.config); diff --git a/src/main/java/org/redkale/net/sncp/Sncp.java b/src/main/java/org/redkale/net/sncp/Sncp.java index 496272e10..1f1bc6910 100644 --- a/src/main/java/org/redkale/net/sncp/Sncp.java +++ b/src/main/java/org/redkale/net/sncp/Sncp.java @@ -71,6 +71,7 @@ public abstract class Sncp { } private Sncp() { + //do nothing } //key: actionid @@ -459,11 +460,13 @@ public abstract class Sncp { * @param classLoader ClassLoader * @param name 资源名 * @param serviceImplClass Service类 + * @param methodBoost 方法扩展 * * @return Service实例 */ @SuppressWarnings("unchecked") - protected static Class createLocalServiceClass(ClassLoader classLoader, final String name, final Class serviceImplClass) { + protected static Class createLocalServiceClass(ClassLoader classLoader, + final String name, final Class serviceImplClass, final AsmMethodBoost methodBoost) { Objects.requireNonNull(serviceImplClass); if (!Service.class.isAssignableFrom(serviceImplClass)) { throw new SncpException(serviceImplClass + " is not Service type"); @@ -576,7 +579,7 @@ public abstract class Sncp { } public static T createSimpleLocalService(Class serviceImplClass, ResourceFactory resourceFactory) { - return createLocalService(null, "", serviceImplClass, resourceFactory, null, null, null, null, null); + return createLocalService(null, "", serviceImplClass, null, resourceFactory, null, null, null, null, null); } /** @@ -587,6 +590,7 @@ public abstract class Sncp { * @param classLoader ClassLoader * @param name 资源名 * @param serviceImplClass Service类 + * @param methodBoost 方法扩展 * @param resourceFactory ResourceFactory * @param sncpRpcGroups SncpRpcGroups * @param client SncpClient @@ -601,6 +605,7 @@ public abstract class Sncp { final RedkaleClassLoader classLoader, final String name, final Class serviceImplClass, + final AsmMethodBoost methodBoost, final ResourceFactory resourceFactory, final SncpRpcGroups sncpRpcGroups, final SncpClient client, @@ -608,7 +613,7 @@ public abstract class Sncp { final String remoteGroup, final AnyValue conf) { try { - final Class newClazz = createLocalServiceClass(classLoader, name, serviceImplClass); + final Class newClazz = createLocalServiceClass(classLoader, name, serviceImplClass, methodBoost); T service = (T) newClazz.getDeclaredConstructor().newInstance(); //-------------------------------------- Service remoteService = null; @@ -630,7 +635,8 @@ public abstract class Sncp { field.setAccessible(true); RedkaleClassLoader.putReflectionField(loop.getName(), field); if (remoteService == null && sncpRpcGroups != null && client != null) { - remoteService = createRemoteService(classLoader, name, serviceImplClass, resourceFactory, sncpRpcGroups, client, agent, remoteGroup, conf); + remoteService = createRemoteService(classLoader, name, serviceImplClass, + methodBoost, resourceFactory, sncpRpcGroups, client, agent, remoteGroup, conf); } if (remoteService != null) { field.set(service, remoteService); @@ -648,6 +654,9 @@ public abstract class Sncp { c.setAccessible(true); c.set(service, agent == null ? null : agent.getName()); } + if (methodBoost != null) { + methodBoost.doInstance(service); + } return service; } catch (RuntimeException rex) { throw rex; @@ -656,15 +665,15 @@ public abstract class Sncp { } } - public static T createSimpleRemoteService(Class serviceImplClass, ResourceFactory resourceFactory, - SncpRpcGroups sncpRpcGroups, SncpClient client, String group) { + public static T createSimpleRemoteService(Class serviceImplClass, + ResourceFactory resourceFactory, SncpRpcGroups sncpRpcGroups, SncpClient client, String group) { if (sncpRpcGroups == null) { throw new SncpException("SncpRpcGroups is null"); } if (client == null) { throw new SncpException("SncpClient is null"); } - return createRemoteService(null, "", serviceImplClass, resourceFactory, sncpRpcGroups, client, null, group, null); + return createRemoteService(null, "", serviceImplClass, null, resourceFactory, sncpRpcGroups, client, null, group, null); } /** @@ -703,6 +712,7 @@ public abstract class Sncp { * @param classLoader ClassLoader * @param name 资源名 * @param serviceTypeOrImplClass Service类 + * @param methodBoost 方法扩展 * @param resourceFactory ResourceFactory * @param sncpRpcGroups SncpRpcGroups * @param client SncpClient @@ -717,6 +727,7 @@ public abstract class Sncp { final ClassLoader classLoader, final String name, final Class serviceTypeOrImplClass, + final AsmMethodBoost methodBoost, final ResourceFactory resourceFactory, final SncpRpcGroups sncpRpcGroups, final SncpClient client, @@ -780,6 +791,9 @@ public abstract class Sncp { c.setAccessible(true); c.set(service, info); } + if (methodBoost != null) { + methodBoost.doInstance(service); + } return service; } catch (Throwable ex) { //do nothing @@ -984,6 +998,9 @@ public abstract class Sncp { c.set(service, info); RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); } + if (methodBoost != null) { + methodBoost.doInstance(service); + } return service; } catch (Exception ex) { throw new SncpException(ex); diff --git a/src/main/java/org/redkale/net/sncp/SncpRpcGroups.java b/src/main/java/org/redkale/net/sncp/SncpRpcGroups.java index 184b46a82..94fdf00cc 100644 --- a/src/main/java/org/redkale/net/sncp/SncpRpcGroups.java +++ b/src/main/java/org/redkale/net/sncp/SncpRpcGroups.java @@ -9,7 +9,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.redkale.boot.ClassFilter; /** - * 协议地址组合对象, 对应application.xml 中 resources->group 节点信息 + * 协议地址组合对象, 对应application.xml中group节点信息 * *

* 详情见: https://redkale.org